【问题标题】:How to set nested object in django rest framework?如何在 django rest 框架中设置嵌套对象?
【发布时间】:2016-02-16 17:57:21
【问题描述】:

首先,这不是关于创建或更新嵌套对象,而只是关于设置它们。让我们使用以下示例:我有以下模型:

class Category(models.Model):
    code= models.CharField(max_length=2)
    name= models.CharField(max_length=100)

class Question(models.Model):
    category= models.ForeignKey(Category, related_name='categories')
    title = models.CharField(max_length=100)

以及以下序列化程序:

class CategorySerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = ('code', 'name')

class QuestionSerializer(serializers.ModelSerializer):
    category= CategorySerializer()

    class Meta:
        model = Question
        fields = ('category', 'title')

现在,当我 getQuestion 时,它按预期正常工作:我按预期得到带有类别字段的问题字段。

我遇到的问题是,当我想 postQuestion 只有 Category.code 时,我不确定如何设置/使用现有的 Category。我一直在尝试不同的方法,但都没有奏效。

如果我删除QuestionSerializer 上的category= CategorySerializer() 并在我的请求中传递Categoryid (pk),那么它正在工作,Question 与相关的@ 一起保存987654336@.

有没有办法说明如何序列化嵌套对象?

提前感谢您的任何评论/建议/解决方案。

【问题讨论】:

标签: django serialization django-rest-framework


【解决方案1】:

我不确定,如果我得到它。在我看来,这似乎是关于创建Question,对吧?

可以覆盖QuestionSerializercreate方法

class QuestionSerializer(serializers.ModelSerializer):
    category= CategorySerializer()

    class Meta:
        model = Question
        fields = ('category', 'title')

    def create(self, validated_data):
        category = validated_data.pop('category')
        category_obj = Category.objects.get(code=category['code'])

        return self.Meta.model.objects.create(category=category, **validated_date)

也许您还必须将CategorySerializer 中的字段name 设置为read_only

【讨论】:

  • 我在第一句话中特别说过这不是关于创建或更新嵌套对象。这是关于使用现有的。
  • @storm_buster 这就是这个答案的作用(我的涵盖了这两种情况)。它会创建一个新的 Question,但会查询以查找现有的 Category 以附加到 Question 实例。
  • @storm_buster 当你 post 数据时,序列化程序的 create 方法被调用。还是您的意思是PATCH/PUT 请求?然后,您应该使用update 方法执行与上述类似的操作。
  • 我明白了,我可以将post/put/patchpk 一起使用,而无需覆盖createupdate 方法。我只是在这里问如果使用pk以外的其他字段是否有快速方法。
猜你喜欢
  • 2014-05-21
  • 2020-11-07
  • 2019-06-14
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多