【问题标题】:perform_create saving user dataperform_create 保存用户数据
【发布时间】:2019-12-19 23:08:09
【问题描述】:

我有让用户预订大厅的 EndPoint。但是当我尝试预订大厅时,它给了我错误NOT NULL constraint failed。我锁定了问题'NOT NULL constraint failed' after adding to models.py。他们建议将 null 放入归档中。但在我的情况下,我必须保存大厅 ID,否则我无法知道用户正在预订的大厅(它在大厅中保存 null)

一开始它显示这个错误:NOT NULL constraint failed: api_bookingmodel.user_id,我通过输入函数perform_create ... serializer.save(user=self.request.user)来解决它

这是我的代码....

模型类

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()

序列化器

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

视图集

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()

它显示此错误:IntegrityError at /api/booking/ NOT NULL constraint failed: api_bookingmodel.hall_id... 我想我必须将大厅 id 保存在 perform_create 函数中,但我做不到。 奇怪的是,当我在预订序列化程序中删除 depth = 1 时,它不会显示错误 ...任何人都有解决方案。

【问题讨论】:

  • @bear-brown 你能帮我吗 plz :)

标签: django django-models django-rest-framework django-forms django-views


【解决方案1】:

您可以在 BookingViewSet 类中覆盖 def perform_create,如下所示:

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

确保 hall_id 在发布请求中已准备就绪。 HallSerializer 中的 def perform_create 也无用。阅读cdrf.co

【讨论】:

  • 不幸的是无法正常工作。我之前尝试过这个解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多