【问题标题】:Why django-rest-framework (using django-nonrel with mongodb) sets to null child objects PKs when updating an instance为什么 django-rest-framework(使用 django-nonrel 和 mongodb)在更新实例时设置为空子对象 PK
【发布时间】:2015-06-30 09:50:01
【问题描述】:

任何包含嵌入模型的对象实例都会发生这种情况。 当我尝试更新父实例时,它会将其子 PK 设置为空。

这是一个已更新的 json 对象的摘录:

{
"pk": "558d023d153bd41930b3fcf0",
"checkgroup_id": "checkgroupid 5",
"name": "checkgroup five",
"description": "this an example description",
"control_config": {
    "control_config_1": {
        "pk": null,
        "params": {
            "param2": {
                "pk": null,
                "value": "value2",
                "mandatory": false,
                "default": "default"
            },
            "param1": {
                "pk": null,
                "value": "value1",
                "mandatory": false,
                "default": "default"
            }
        },
        "exceptions": {
            "exception1": {
                "pk": null,
                "description": "description example",
                "params": [
                    {
                        "pk": null,
                        "value": "value1",
                        "mandatory": false,
                        "default": "default"
                    },
                    {
                        "pk": null,
                        "value": "value2",
                        "mandatory": false,
                        "default": "default"
                    }
                ]
            }
        }
    }
},

这是模型:

class CheckGroup(models.Model):
"""It defines a set of controls to be applied. """
    checkgroup_id = models.TextField(max_length=250)
    name = models.TextField(max_length=250)
    description = models.TextField(max_length=250)
    control_config = DictField(EmbeddedModelField(ControlConfig))
    controls = DictField(EmbeddedModelField(Control))

其序列化器定义为:

class CheckGroupSerializer(serializers.ModelSerializer):
""" Transforms CheckGroup into json
"""
control_config =  serializers.DictField(child=ControlConfigSerializer())
controls = serializers.DictField(child=ControlSerializer())
pk = serializers.CharField()

class Meta:
    """ It lets to choose the model that will be serialize and its         fields
    """
    model = CheckGroup
    fields = ('pk', 'checkgroup_id', 'name', 'description', 'control_config', 'controls')

【问题讨论】:

    标签: django mongodb django-rest-framework django-nonrel


    【解决方案1】:

    好吧,我在 django-rest-framework 文档上找到了原因。 问题是框​​架没有解决这个问题,应该由我们来实现。

    文档说:

    因为嵌套创建和更新的行为可能不明确,并且可能需要相关模型之间的复杂依赖关系,REST framework 3 要求您始终明确地编写这些方法。默认的 ModelSerializer .create() 和 .update() 方法不包括对可写嵌套表示的支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-31
      • 2017-03-05
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2016-07-03
      • 2014-07-10
      相关资源
      最近更新 更多