Django Rest Framework 添加具有外键和深度 = 1 的对象

标签 django rest

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

相关文章:

html - 如何在 Django 中用另一种语言翻译整个 html 页面?

django - 快速查找 Django QuerySet 中的最后一个元素?

django - 修改Django UserCreationForm

java - 从 SUGARCRM 查询数据

rest - 如何禁用 Firebase 数据库的 REST API 调用?

java - 为什么我们不同步 Web 服务?

html - bootstrap4.0 包括搜索表单和登录导航栏

python - Django F 似乎不起作用?

java - Spring RestTemplate 配置策略从单个 API 调用多个 rest 服务

rest - 使用nodejs获取cookie