Django 当ForeignKey指向';自我';
我有一个类别模型,它有一个字段父项。此字段可以为空,并指向同一模型中的其他类别。我无法序列化该类别,无法使用django rest框架获取其子类别的列表 models.pyDjango 当ForeignKey指向';自我';,django,django-rest-framework,Django,Django Rest Framework,我有一个类别模型,它有一个字段父项。此字段可以为空,并指向同一模型中的其他类别。我无法序列化该类别,无法使用django rest框架获取其子类别的列表 models.py class Category(models.Model): ... name = models.CharField( _('category name'), max_length=255, unique=True ) slug = mode
class Category(models.Model):
...
name = models.CharField(
_('category name'),
max_length=255,
unique=True
)
slug = models.SlugField(
_('slug'),
max_length=50,
help_text=_(
'A slug is a short label for something, containing only letters, numbers, underscores or hyphens. They’re generally used in URLs.'
),
)
parent = models.ForeignKey(
'self',
on_delete=models.CASCADE,
related_name='category',
blank=True,
null=True
)
...
序列化程序.py
class CategoryChildrenSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = Category
fields = ['children']
def get_children(self, instance):
if instance.parent is not None:
queryset = Category.objects.filter(parent=instance.parent.id)
return queryset
class CategoriesNavigationSerializer(serializers.ModelSerializer):
children = CategoryChildrenSerializer(many=True, read_only=True)
class Meta:
model = Category
fields = ('name', 'children')
理想情况下,我希望响应看起来像:
{
name: Category 1,
children: [
{
name: Category 2,
slug: ...
},
{
name: Category 3,
slug: ...
},
]
}
同样重要的是要注意,我想停在第二个孩子的层面上,即使父母有孙子女
我尝试了children=serializers.StringRelatedField(source='parent',read_only=True)
,还尝试了CategoriesNavigationSerializer
中的get\u children
方法,无法将queryset对象返回到序列化程序。SerializerMethodField
,它应该是一个干净的序列化结果,如str
,int
,float
,list
,dict
,None
,等等
尝试将您的get_children
更改为:
def get_children(self, instance):
if instance.parent:
queryset = Category.objects.filter(parent=instance.parent)
return queryset.values_list('id', 'name', 'slug', flat=True)
return []
无法将queryset对象返回到序列化程序。SerializerMethodField
,它应该是干净的序列化结果,如str
,int
,float
,列表
,dict
,无
,等等
尝试将您的get_children
更改为:
def get_children(self, instance):
if instance.parent:
queryset = Category.objects.filter(parent=instance.parent)
return queryset.values_list('id', 'name', 'slug', flat=True)
return []
使用CategoriesNavigationSerializer序列化程序类从
获取子项(…)
方法返回序列化程序结果
class CategoryChildrenSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = Category
fields = ['children']
def get_children(self, instance):
return CategoriesNavigationSerializer(
instance.category.all(),
many=True
).data
class CategoryChildrenSerializer(serializers.ModelSerializer):
children=serializers.SerializerMethodField()
类元:
型号=类别
字段=['children']
def get_子项(自身、实例):
返回分类导航序列化程序(
instance.category.all(),
多=真
).data
使用分类导航序列化程序
序列化程序类从获取子项(…)
方法返回序列化程序结果
class CategoryChildrenSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = Category
fields = ['children']
def get_children(self, instance):
return CategoriesNavigationSerializer(
instance.category.all(),
many=True
).data
class CategoryChildrenSerializer(serializers.ModelSerializer):
children=serializers.SerializerMethodField()
类元:
型号=类别
字段=['children']
def get_子项(自身、实例):
返回分类导航序列化程序(
instance.category.all(),
多=真
).数据