如何在DRF中获取并显示父序列化器中的所有子对象

use*_*776 3 foreign-keys django-generic-views django-serializer django-rest-framework

我有 3 个不同的序列化器,用于父对象和子对象的 3 个不同视图。意见是CreateAPIView,,ListAPIViewRetrieveAPIView

因此,我CreateAPIView有一个用于创建对象的序列化器,ListAPIView有一个用于列出对象的序列化器,还有RetrieveAPIView一个用于显示对象的详细信息的序列化器。对于子对象和父对象都是如此。

如何列出父对象中与其相关的所有子对象?这意味着RetrieveAPIView我想在父级中展示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)

Run Code Online (Sandbox Code Playgroud)

序列化器:

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)

Run Code Online (Sandbox Code Playgroud)

同样,我也有列表的序列化器。( boards- parent object, lists-children)。

如何在Boards与其相关的详细视图中显示所有列表?

Ken*_*ars 7

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

  1. source通过将此字段添加到以下内容来使用参数BoardDetailSerializer

    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)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您也可以使用SerializerMethodField()与用户相同的方式。在该方法中,您需要通过序列化器传递列表并获取 json 格式的数据(假设您使用默认的 json 渲染器)