首页 > 解决方案 > django.db.utils.IntegrityError:在 POST 请求中

问题描述

我正在创建一个 post 函数来将数据保存在模型中,代码如下:

视图.py

class take_quizapi(CreateAPIView):

    def post(self, request,pk, *args, **kwargs):
        supplier = request.user.supplier

        data = request.data.copy()
        data["supplier_id"] = supplier.user_id
        data["score"] = 0
        data["quiz"] = pk
        print("data is", data)
        serializer = takenquizSerializer(data=data)

        if serializer.is_valid():
            serializer.save()
            print("Serializer data", serializer.data)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

当我从邮递员那里调用 API 时,它说:

django.db.utils.IntegrityError:“supplier_id”列中的空值违反非空约束

但我显然提供了data["supplier_id"] = supplier.user_id. 我在这里做错了什么?

序列化程序.py

class takenquizSerializer(serializers.ModelSerializer):
    supplier = ReadOnlyField(source='supplier.supplier_fname')
    class Meta:
        model = TakenQuiz
        fields = "__all__"

模型.py

class TakenQuiz(models.Model):
    supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE, related_name='taken_quizzes')
    quiz = models.ForeignKey(Quiz, on_delete=models.CASCADE, related_name='taken_quizzes')
    score = models.FloatField()
    date = models.DateTimeField(auto_now_add=True)
    least_bid = models.IntegerField(default=0)
    confirmed = models.CharField(max_length=100, default='Not Confirmed')

标签: djangodjango-rest-framework

解决方案


supplier是一个只读字段。所以没有必要将它添加到数据字典中,因为它永远不会被使用。

无论如何,您都不应该修改帖子数据 - 有一个不可变的原因。而是在保存时将其传递

serializer = takenquizSerializer(data=request.data)

if serializer.is_valid():
    serializer.save(supplier_id=supplier.user_id, score=0, quiz=pk)

推荐阅读