Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 当ForeignKey指向';自我';_Django_Django Rest Framework - Fatal编程技术网

Django 当ForeignKey指向';自我';

Django 当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

我有一个类别模型,它有一个字段父项。此字段可以为空,并指向同一模型中的其他类别。我无法序列化该类别,无法使用django rest框架获取其子类别的列表

models.py

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(),
多=真
).数据