如何在 DRF 中获取并显示 parent 序列化程序中的所有 child objects

How to get and display all child objects in parent serializer in DRF

我有 3 个不同的序列化程序,用于 parent 和 child object 的 3 个不同视图。观看次数为 CreateAPIViewListAPIViewRetrieveAPIView

所以我的 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 的详细视图中显示与之相关的所有列表?

您可以通过不同的方式执行此操作:

  1. 通过将此字段添加到 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)
    
  2. 您也可以像为用户一样使用 SerializerMethodField()。在该方法中,您需要通过序列化程序传递列表并获取 json 格式的数据(假设您使用的是默认 json 渲染器)