【发布时间】: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