Django Rest Framework使用外键和depth = 1添加对象

时间:2016-11-02 16:39:14

标签: django rest

使用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)

1 个答案:

答案 0 :(得分:0)

这个问题已经很老了,但没有人回答,因为我遇到了同样的问题。

事实上,响应在于版本3.0的release note

  

如果你定义一个深度,你现在必须编写自己的创建和   更新将处理嵌套字段修改的方法。

链接到documentation