发布数据给我IntegrityError Django

时间:2018-10-07 05:12:22

标签: python django api django-rest-framework

我是Django的新手,我正在尝试使用DRF为文章发布数据-键和值:

class ArticalMetaData(models.Model):
    key = models.CharField()
    value = models.CharField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    class Meta:
        unique_together = ("content_type", "object_id", "key")


class MetaDataCreationSerializer(serializers.ModelSerializer):

    def __init__(self, content_object, *args, **kwargs):
        self.content_object = content_object
        super(MetaDataCreationSerializer, self).__init__(*args, **kwargs)

    class Meta:
        model = MetaData
        fields = ('key', 'value','content_object')

这是视图:

    def create(self, request, pk=None):
    Artical = self.get_object()
    if request.method == 'POST':
        serializer = MetaDataCreationSerializer(data=request.data, content_object=Artical)
        if serializer.is_valid():
            metadata = serializer.save()
            metadata.content_object = Articla
            metadata.save()
            serializer = MetaDataSerializer(metadata)
            return Response(serializer.data)

但这给了我这个错误:

Exception Type: IntegrityError
Exception Value:    
null value in column "object_id" violates not-null constraint

2 个答案:

答案 0 :(得分:0)

似乎您有一个现有数据库,其值为object_id为空。然后,您更新了unique_together字段。因此,现有数据与新规则,即unique_together不匹配。 我建议先备份数据库,然后再删除它。然后再次运行makemigrations并迁移命令。

答案 1 :(得分:0)

因此,错误来自以下事实:在序列化程序中,您未在元字段中指定object_id

默认情况下,Django模型中的所有字段都是必填字段,并且不接受空值。

如果希望字段为空,则需要为模型中的字段显式设置null=True。但是在您的情况下,由于它是唯一约束的一部分,所以我不希望null为正确值。

解决方案是在序列化器的字段中包含object_id

您可以在帖子请求中发送它,但是序列化程序将忽略它,因为它不在要序列化的字段列表中。

这就是为什么我要求您包括您发送的POST数据的原因。