0

I have EndPoint that let user booking halls. But when i try to booking hall it give me error NOT NULL constraint failed. I lock at the problem 'NOT NULL constraint failed' after adding to models.py. they suggest to put null in the filed. But in my case i must save the hall id otherwise I can not know the hall that user is booking (it save null in the hall)

at the beginning it show this Error: NOT NULL constraint failed: api_bookingmodel.user_id and I solve it by putting in the function perform_create ... serializer.save(user=self.request.user)

This is my Code....

Model classes

class HallModel(models.Model):

    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='hall_owner')
    name = models.CharField(max_length=100)
    price = models.FloatField()
    phone = models.CharField(max_length=9, blank=True)
    size = models.CharField(max_length=50)
    region = models.CharField(max_length=100)
    state = models.CharField(max_length=100)
    image_1 = models.ImageField(upload_to='halls_image')
    image_2 = models.ImageField(upload_to='halls_image')
    image_3 = models.ImageField(upload_to='halls_image')
    created_at = models.DateTimeField(auto_now_add=True)



class BookingModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user_booking')
    hall = models.ForeignKey(HallModel, on_delete=models.CASCADE, related_name='hall_owner')

    time_date = models.DateTimeField(auto_now_add=True)
    booking_method = models.IntegerField()

Serializer

class HallSerializer(serializers.ModelSerializer):
    booking = serializers.SerializerMethodField()

    class Meta:
        model = HallModel
        fields = '__all__'

    def get_booking(self, obj):
        booking = BookingSerializer(obj.hall_owner.all(),many=True).data
        return booking


    def perform_create(self, serializer):
        serializer.save()


class BookingSerializer(serializers.ModelSerializer):
    hall = serializers.SerializerMethodField()

    class Meta:
        model = BookingModel
        fields = '__all__'
        depth = 1

    def get_hall(self, obj):
        serializer_data = HallSerializer(obj.hall).data
        return serializer_data

View Sets

class HallViewSet(viewsets.ModelViewSet):
    queryset = HallModel.objects.all()
    serializer_class = HallSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)



class BookingViewSet(viewsets.ModelViewSet):

    serializer_class = BookingSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def get_queryset(self):
        return self.request.user.user_booking.all()

it show this Error: IntegrityError at /api/booking/ NOT NULL constraint failed: api_bookingmodel.hall_id... I think i must save the hall id in the perform_create function but I don't able to do it. the stange things is when i delete the depth = 1 in the booking serializer it not show me the Error ... any one have a solution.

prg.dev
  • 141
  • 1
  • 3
  • 16

1 Answers1

1

You can override def perform_create in BookingViewSet class, like below:

def perform_create(self, serializer):
   serializer.save(
      user=self.request.user,
      hall=self.request.data['hall_id']
   )

make sure that hall_id is ready in post request. Also def perform_create in HallSerializer is useless. read cdrf.co

Mahrus Khomaini
  • 660
  • 1
  • 6
  • 14