【问题标题】:How to get and display all child objects in parent serializer in DRF如何在 DRF 的父序列化程序中获取和显示所有子对象
【发布时间】:2019-05-09 04:37:04
【问题描述】:

对于父对象和子对象的 3 个不同视图,我有 3 个不同的序列化程序。观看次数为CreateAPIViewListAPIViewRetrieveAPIView

所以我的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)

序列化器:

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

【问题讨论】:

  • 父母和孩子到底是什么意思?您能否展示您的模型和序列化程序,以便我们了解它们之间的关系?嵌套的序列化器可能是你需要的,但我不能肯定

标签: django-rest-framework foreign-keys django-generic-views django-serializer


【解决方案1】:

有多种方法可以做到这一点:

  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渲染器)

【讨论】:

  • 我已经尝试过你所说的第二种方法,它给出了一些 Json 类型错误,也试图解决这个问题,但没有成功。
  • @Ken4cholars 文件“C:\Users\ADMIN\AppData\Local\Programs\Python\Python36\lib\site-packages\rest_framework\serializers.py”,第 118 行,在 init super(BaseSerializer, self).__init__(**kwargs) TypeError: __init__() got an unexpected keyword argument 'queryset'
  • @user10058776 是的,请删除查询集参数。它不应该在那里
  • 源参数指定了什么?我的“Lists_set”叫什么?
  • 这是从 Board 回到 Lists 的相关名称。如果未指定,Django 将其命名为<model_name>_set。这就是为什么它是Lists_set。通常,源指定要在序列化程序中为该字段获取的模型属性的名称
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2016-08-14
相关资源
最近更新 更多