【发布时间】:2017-03-16 01:49:39
【问题描述】:
使用 Django Rest Framework,我尝试通过 POST 添加模型对象,指定新对象应该具有外键的现有对象的 id。作品。但是,如果我将 depth=1 添加到新对象的序列化程序中,以便在 GET 中获取外键目标,则添加新对象的 POST 失败,并出现 mysql 错误 'IntegrityError: (1048, "Column 'reportdefinition_id' cannot为 null")',即使我在 POST 中指定了有效的外键 ID。
我可以通过将 depth = 1 排除在外并在我的客户端中单独检索报告定义来解决此问题,但这很麻烦。
(我发现了两个相关的问题,但都没有回答我的问题: 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 时,它不会。我必须明确添加它。
深度 = 1 的 DRF 可浏览 API 内容:
{
"status": null,
}
(我在发布 POST 时添加了“reportdefinition”:1,并使用 Chrome 开发者工具验证它是否出现)
没有“深度 = 1”的 DRF 可浏览 API 内容:
{
"status": null,
"reportdefinition": null
}
(我在发布 POST 时将 null 替换为 1)
【问题讨论】: