一尘不染

Django rest框架嵌套了自指对象

django

我有看起来像这样的模型:

class Category(models.Model):
    parentCategory = models.ForeignKey('self', blank=True, null=True, related_name='subcategories')
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500)

我设法通过序列化器获得了所有类别的平面json表示形式:

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.ManyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

现在,我要做的是让子类别列表具有子类别的内联json表示形式而不是其ID。django-rest-framework我该怎么做?我试图在文档中找到它,但它似乎不完整。


阅读 460

收藏
2020-03-27

共1个答案

一尘不染

而不是使用ManyRelatedField,请使用嵌套的序列化程序作为字段:

class SubCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('name', 'description')

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.SubCategorySerializer()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

如果要处理任意嵌套的字段,则应查看自定义文档的默认字段部分。你目前无法直接将序列化器声明为自身的字段,但是可以使用这些方法来覆盖默认情况下使用的字段。

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

        def get_related_field(self, model_field):
            # Handles initializing the `subcategories` field
            return CategorySerializer()

实际上,正如你所指出的,上述内容并不完全正确。这有点骇人听闻,但你可以尝试在声明序列化程序之后添加字段。

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

CategorySerializer.base_fields['subcategories'] = CategorySerializer()

声明递归关系的机制是需要添加的。

2020-03-27