Django rest框架嵌套了自指对象

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

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我该怎么做?我试图在文档中找到它,但它似乎不完整。

回答:

而不是使用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()

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

以上是 Django rest框架嵌套了自指对象 的全部内容, 来源链接: utcz.com/qa/413553.html

回到顶部