使用 Django Rest Framework,我尝试通过 POST 添加模型对象,指定新对象应具有外键的现有对象的 id。作品。但是,如果我将 depth=1 添加到新对象的序列化程序,以便在 GET 中获取外键目标,则添加新对象的 POST 将失败,并显示 mysql 错误 'IntegrityError: (1048, "Column 'reportdefinition_id' cannot为空")',即使我在我的 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
我注意到的一件事:如果没有 depth = 1,DRF 可浏览 API 在其默认情况下会显示“reportdefinition”,但如果 depth = 1,则不会。我必须明确添加它。
深度 = 1 的 DRF 可浏览 API 内容:
{
"status": null,
}
(我在发出 POST 时添加“reportdefinition”:1,并使用 Chrome 开发人员工具验证它是否出现)
没有“depth = 1”的 DRF 可浏览 API 内容:
{
"status": null,
"reportdefinition": null
}
(我在发出 POST 时将 null 替换为 1)
最佳答案
这个问题很老了,但没有人回答,我也有同样的问题。
事实上,回应在于release note 3.0 版:
If you define a depth, you now have to write your own create and update methods that will handle the modification of the nested fields.
链接到 documentation .
关于Django Rest Framework 添加具有外键和深度 = 1 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40385210/