如何在 DRF 中获取并显示 parent 序列化程序中的所有 child objects
How to get and display all child objects in parent serializer in DRF
我有 3 个不同的序列化程序,用于 parent 和 child object 的 3 个不同视图。观看次数为 CreateAPIView
、ListAPIView
、RetrieveAPIView
。
所以我的 CreateAPIView
有一个用于创建 object 的序列化器,ListAPIView
有一个用于列出 object 的序列化器,而 RetrieveAPIView
有一个用于显示 object 的详细信息。 child 和 parent object.
也是如此
如何列出parentobject中所有与之相关的childobject?
这意味着在 parent 的 RetrieveAPIView
中,我想显示其 children 的 ListAPIView
。
型号:
class Boards(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Boards, self).save(*args, **kwargs)
class Lists(models.Model):
name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()
board = models.ForeignKey(Boards, on_delete=models.CASCADE)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Lists, self).save(*args, **kwargs)
序列化程序:
class BoardCreateSerializer(ModelSerializer):
# user = request.user
class Meta:
model = Boards
fields = ['name']
class BoardListSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name = 'trello:board-detail',
lookup_field = 'slug',
)
user = SerializerMethodField()
class Meta:
model = Boards
fields = ['url', 'name', 'user']
def get_user(self, obj):
return str(obj.user.username)
class BoardDetailSerializer(ModelSerializer):
user = SerializerMethodField()
class Meta:
model = Boards
fields = ['id', 'name', 'user']
def get_user(self, obj):
return str(obj.user.username)
同样,我也有列表序列化器。(boards- parent object, lists-children
)。
如何在 Boards
的详细视图中显示与之相关的所有列表?
您可以通过不同的方式执行此操作:
通过将此字段添加到 BoardDetailSerializer
使用 source
参数:
class BoardDetailSerializer(ModelSerializer):
user = SerializerMethodField()
lists = ListSerializer(
source='Lists_set',
many=True
)
class Meta:
model = Boards
fields = ['id', 'name', 'user', 'lists']
def get_user(self, obj):
return str(obj.user.username)
您也可以像为用户一样使用 SerializerMethodField()
。在该方法中,您需要通过序列化程序传递列表并获取 json 格式的数据(假设您使用的是默认 json 渲染器)
我有 3 个不同的序列化程序,用于 parent 和 child object 的 3 个不同视图。观看次数为 CreateAPIView
、ListAPIView
、RetrieveAPIView
。
所以我的 CreateAPIView
有一个用于创建 object 的序列化器,ListAPIView
有一个用于列出 object 的序列化器,而 RetrieveAPIView
有一个用于显示 object 的详细信息。 child 和 parent object.
如何列出parentobject中所有与之相关的childobject?
这意味着在 parent 的 RetrieveAPIView
中,我想显示其 children 的 ListAPIView
。
型号:
class Boards(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Boards, self).save(*args, **kwargs)
class Lists(models.Model):
name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()
board = models.ForeignKey(Boards, on_delete=models.CASCADE)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Lists, self).save(*args, **kwargs)
序列化程序:
class BoardCreateSerializer(ModelSerializer):
# user = request.user
class Meta:
model = Boards
fields = ['name']
class BoardListSerializer(ModelSerializer):
url = HyperlinkedIdentityField(
view_name = 'trello:board-detail',
lookup_field = 'slug',
)
user = SerializerMethodField()
class Meta:
model = Boards
fields = ['url', 'name', 'user']
def get_user(self, obj):
return str(obj.user.username)
class BoardDetailSerializer(ModelSerializer):
user = SerializerMethodField()
class Meta:
model = Boards
fields = ['id', 'name', 'user']
def get_user(self, obj):
return str(obj.user.username)
同样,我也有列表序列化器。(boards- parent object, lists-children
)。
如何在 Boards
的详细视图中显示与之相关的所有列表?
您可以通过不同的方式执行此操作:
通过将此字段添加到
BoardDetailSerializer
使用source
参数:class BoardDetailSerializer(ModelSerializer): user = SerializerMethodField() lists = ListSerializer( source='Lists_set', many=True ) class Meta: model = Boards fields = ['id', 'name', 'user', 'lists'] def get_user(self, obj): return str(obj.user.username)
您也可以像为用户一样使用
SerializerMethodField()
。在该方法中,您需要通过序列化程序传递列表并获取 json 格式的数据(假设您使用的是默认 json 渲染器)