gpt4 book ai didi

Django rest 框架嵌套自引用对象

转载 作者:行者123 更新时间:2023-11-28 19:33:11 25 4
gpt4 key购买 nike

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

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')

如果你想处理任意嵌套的字段,你应该看看 customising the default fields文档的一部分。您目前无法直接将序列化程序声明为自身的字段,但您可以使用这些方法来覆盖默认使用的字段。

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()

实际上,正如您所指出的那样,上述说法并不完全正确。这有点 hack,但您可以尝试在已声明序列化程序后添加该字段。

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

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

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

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


编辑:请注意,现在有专门处理此类用例的第三方包可用。参见 djangorestframework-recursive .

关于Django rest 框架嵌套自引用对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13376894/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com