我是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
答案 0 :(得分:0)
似乎您有一个现有数据库,其值为object_id
为空。然后,您更新了unique_together
字段。因此,现有数据与新规则,即unique_together
不匹配。
我建议先备份数据库,然后再删除它。然后再次运行makemigrations
并迁移命令。
答案 1 :(得分:0)
因此,错误来自以下事实:在序列化程序中,您未在元字段中指定object_id
。
默认情况下,Django模型中的所有字段都是必填字段,并且不接受空值。
如果希望字段为空,则需要为模型中的字段显式设置null=True
。但是在您的情况下,由于它是唯一约束的一部分,所以我不希望null为正确值。
解决方案是在序列化器的字段中包含object_id
。
您可以在帖子请求中发送它,但是序列化程序将忽略它,因为它不在要序列化的字段列表中。
这就是为什么我要求您包括您发送的POST数据的原因。