코딩/Django

장고 호텔 예약 시스템

김은수2 2023. 5. 11. 21:15

 

모델

 

class Book(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    room = models.ForeignKey(Rooms, on_delete=models.CASCADE, related_name='bookset')
    created_at = models.DateTimeField(auto_now_add=True)
    members = models.IntegerField(default=1)
    check_in = models.DateField()
    check_out = models.DateField()

    def __str__(self):
        return self.user

 

 

user 와 room을 foreignkey로 받아온다. 

그리고 self.user 부분 주석처리해줘야함 

 


 

class BookManage(APIView):
    def get(self, request, pk):
        all_books = get_object_or_404(Book, id=pk)
        serializer = BookSerializer(all_books)
        return Response(serializer.data)

    def post(self, request, pk):
        room = get_object_or_404(Rooms, id=pk)
        serializer = BookSerializer(data = request.data)
 
        if serializer.is_valid():
            if not room.bookset.filter(room=pk, check_in=request.data["check_in"]).exists():
                serializer.save(user=request.user, room=room)
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            else:
                return Response('예약할 수 없음')
        else:
            return Response(serializer.errors)
   
    
    def delete(self, request, pk):
        book = get_object_or_404(Book, id=pk)
        if request.user == book.user:
            book.delete()
            return Response("예약 취소됨", status=status.HTTP_204_NO_CONTENT)
        else:
            return Response("권한이 없음")

예약 객체를 생성하고 지우고, 조회할 수 있다. 

(room.bookset 으로 room 객체에서 book 조회 역참조)


시리얼라이저 

class BookSerializer(serializers.ModelSerializer):

    def get_user(self, obj):
        print(obj.user.email)
        return obj.user.email

    class Meta():
        extra_kwargs = {"user": {"required":False}, "room": {"required":False}}
        model = Book
        fields = '__all__'

시리얼라이저에서 required를 False로 바꾼다. 

'코딩 > Django' 카테고리의 다른 글

시리얼라이저에 대한 이해  (0) 2023.05.17
DRF를 이용한 팀프로젝트 진행  (0) 2023.05.09
프로젝트 기획  (1) 2023.05.08
시리얼라이저 복습  (0) 2023.05.04
파일 입출력  (0) 2023.05.03