如何设置序列化程序以将父级和子级显示为列表DRF



我正在制作一个关于新闻的应用程序新闻有一个名为Category的属性,可以嵌套例如:人类:--身体器官:----手只是为了让问题更清楚我们需要准备一种方法,以便在制作新闻时,当我们选择"人类"类别时,我们可以访问"人类"的孩子;身体器官";并且当选择该选项时;"手";或其他孩子这是我的模型文件:

```
class News(models.Model):
PUBLISH_STATUS = (
('P', 'Published'),
('W', 'Waiting for approval'),
('D', 'Draft'),
)
title = models.CharField(max_length=255)
slug = models.SlugField(null=True, blank=True)
sign_image = models.ImageField(upload_to='images', null=True, blank=True)
summary = models.TextField(null=True, blank=True)
description = models.TextField()
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
publish_status = models.CharField(max_length=1, choices=PUBLISH_STATUS, default='D')
publish_time = models.TimeField(null=True, blank=True, default=None)
publish_date = models.DateTimeField(null=True, blank=True, default=None)
author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
category = models.ManyToManyField('Category')
tag = models.ManyToManyField('Tag')
def __str__(self):
return self.title

class Category(models.Model):
PUBLISH_CHOICES = (
('A', 'Active'),
('I', 'Inactive'),
)
parent = models.ForeignKey('Category', on_delete=models.PROTECT, null=True, blank=True)
name = models.CharField(max_length=50, null=True)
publish_status = models.CharField(max_length=1, choices=PUBLISH_CHOICES, default='A')
description = models.TextField(null=True, blank=True)
tag = models.ManyToManyField('Tag')
def __str__(self):
return self.name
```

还有序列化程序:

class CategorySerializer(ModelSerializer):
class Meta:
model = Category
fields = ['name', 'parent']
list = ListSerializer(
fields=['name', 'parent'],
source='get_parent'
)
@staticmethod
def get_parent(obj):
return obj.parent.name

class NewsSerializer(ModelSerializer):
@staticmethod
def get_title_slug(instance):
return slugify(instance.title)
@staticmethod
def get_user(obj):
return obj.author.username
slug = SerializerMethodField(method_name='get_title_slug', read_only=True)
author = SerializerMethodField(method_name='get_user')
class Meta:
model = News
fields = '__all__'
category = CategorySerializer()
read_only_fields = ['author', 'publish_date', 'publish_time']

如果你能帮助我,我将不胜感激

如果您正试图与他们的孩子一起获取类别,请首先使用related_name来更容易地访问孩子:

parent = models.ForeignKey('Category', on_delete=models.PROTECT, null=True, blank=True, related_name="children")

然后,您可以通过children键访问类别子项。

现在只需使用嵌套的序列化程序:

class CategoryChildrenSerializer(serializer.ModelSerializer):
class Meta:
model = Category
fields = [...]

class CategorySerializer(ModelSerializer):
children = CategoryChildrenSerializer(many=True)

class Meta:
model = Category
fields = [..., "children"]

最新更新