繁体   English   中英

Django Rest 框架:按id创建/更新,output字典

[英]Django Rest Framework: Create / Update by id, output dictionary

我有一个 django-rest-framework model 视图集(用于测试),它使用这样的序列化:

class ProcessSerializer(serializers.Serializer):
    class Meta:
        model = Process.draft_model
        fields = ['id', 'name']


class TestSerializer(serializers.ModelSerializer):
    process = ProcessSerializer()

    class Meta:
        model = ConfigurationTest
        fields = [
            'id',
            'name',
            'process',
        ]

这在检索测试时效果很好,但不适用于创建/更新,理想情况下我希望只向 ID 提供这样的请求:

{
  process: 1
  name: 'A new test'
}

将该请求发送到服务器时,我收到类似Invalid data. Expected a dictionary, but got int Invalid data. Expected a dictionary, but got int

我尝试了什么:

  • processprocess_id作为包含字段,并在 POST 请求中发送process_id 在这种情况下,我收到一个错误,例如process_id cannot be null ,这很容易混淆。
  • create操作使用不同的序列化程序,它将process用作普通的 PrimaryKeyRelatedField,而没有嵌套的序列化程序。 这对于获取请求非常有效,但显然也意味着服务器对该 POST 请求的响应不包括嵌套良好的序列化程序。

参考型号

class ConfigurationTest(...):
    name = CharField(max_length=120)
    process = ForeignKey(Process)

class Process(...):
    name = CharField(max_length=120)

我会给一个这样的序列化程序。 一个用于 read_only 的序列化器字段,其中它使用 ProcessSerializer 和用于 write_only 的 process_id 作为 integer。

class TestSerializer(serializers.ModelSerializer):
    process = ProcessSerializer(read_only=True)
    process_id = IntegerField(write_only=True)

    class Meta:
        model = ConfigurationTest
        fields = [
            'id',
            'name',
            'process',
            'process_id',
        ]
 

并发布:

{
  process_id: 1
  name: 'A new test'
}

我不是 100% 确定您不需要覆盖创建/更新,但这应该可以正常工作。

注意:我看到你尝试了类似逻辑的东西。 但它是相同的代码吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM