使用Django Rest Framework,我试图通过POST添加一个模型对象,指定新对象应该有一个外键的现有对象的id。作品。但是,如果我向新对象的序列化程序添加了深度= 1,那么我在GET中获取外键目标,添加新对象的POST失败并出现mysql错误' IntegrityError:(1048 ,"列' reportdefinition_id'不能为空")',即使我在POST中指定了有效的外键ID。
我可以通过保留depth = 1并在我的客户端中单独检索reportdefinition来解决这个问题,但这很麻烦。
(我发现了两个相关问题,但都没有回答我的问题: Django REST - Create object with foreign key using serializers Need to show Foreign Key Object in Details by Django Rest Framework)
模型(我没有显示不相关的字段):
class ReportDefinition(models.Model):
name = models.CharField(max_length=254, blank=True, null=True)
class ReportRun(models.Model):
status = models.IntegerField(default=2)
reportdefinition = models.ForeignKey(ReportDefinition)
串行器:
class ReportDefinitionSerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
class Meta:
model = models.ReportDefinition
fields = ("id","name")
class ReportRunSerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
class Meta:
depth = 1
model = models.ReportRun
fields =("id","status","reportdefinition")
如果我删除' depth = 1',则可以使用POST。
class ReportRunSerializer(serializers.ModelSerializer):
id = serializers.ReadOnlyField()
class Meta:
model = models.ReportRun
fields =("id","status","reportdefinition")
POST内容(再次,与其他属性无关):
reportdefinition:1
我注意到一件事:没有深度= 1,DRF可浏览的API显示" reportdefinition"在默认情况下,但深度= 1,它没有。我必须明确地添加它。
DRF可浏览的API内容,深度= 1:
{
"status": null,
}
(我在发布POST时添加" reportdefinition":1,并使用Chrome开发者工具验证它是否显示)
DRF可浏览的API内容,没有' depth = 1':
{
"status": null,
"reportdefinition": null
}
(我在发布POST时将null替换为1)
答案 0 :(得分:0)
这个问题已经很老了,但没有人回答,因为我遇到了同样的问题。
事实上,响应在于版本3.0的release note:
如果你定义一个深度,你现在必须编写自己的创建和 更新将处理嵌套字段修改的方法。
链接到documentation。