【问题标题】:Django Rest Framework add object with foreign key and depth = 1Django Rest Framework 添加具有外键和深度 = 1 的对象
【发布时间】: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)

【问题讨论】:

    标签: django rest


    【解决方案1】:

    这个问题已经很老了,但是没有人回答,而且我也遇到了同样的问题。

    其实响应就在于3.0版本的release note:

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

    链接到documentation。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 2013-03-30
      • 2017-08-15
      相关资源
      最近更新 更多