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