如何在django rest框架中设置嵌套对象?

sto*_*ter 5 django serialization django-rest-framework

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

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)
Run Code Online (Sandbox Code Playgroud)

和以下序列化器:

class CategorySerializer(serializers.ModelSerializer):

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

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

    class Meta:
        model = Question
        fields = ('category', 'title')
Run Code Online (Sandbox Code Playgroud)

现在,我在getQuestion,其优良的工作如预期:我与他类领域的问题领域的预期.

我遇到的问题是当我想要post一个Question只有Category.code,我不确定如何设置/使用现有的Category.我一直在尝试不同的方式,但没有一个有效.

如果我删除category= CategorySerializer()QuestionSerializer和我通id(pk的),Category在我的要求,是不是比工作时,Question保存与相关Category.

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

提前感谢您提出任何意见/建议/解决方案.

ils*_*005 1

I'm not sure, if I got it. To me it seems that it is about creating Question, right?

You can overwrite the create method of QuestionSerializer

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)
Run Code Online (Sandbox Code Playgroud)

Maybe you also have to set the field name in CategorySerializer to read_only