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

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

我有 3 个不同的序列化程序,用于 3 个不同的父对象和子对象 View 。 View 是 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 的详细 View 中显示与其相关的所有列表?

最佳答案

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

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

关于django-rest-framework - 如何在DRF中获取并显示父序列化器中的所有子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53669062/

相关文章:

mysql - 如何确保外键在表中只出现有限次数

javascript - 如何从 django request.POST 获取输入数据

sql - 从外键引用获取结果

DjangoRestFramework - 序列化器验证会引发 KeyError,即使它是由 Perform_create() 方法提供的

windows-phone-7 - 芒果 SQL CE : DeleteRule ="Cascade" not working

django - django教程中的通用 View UpdateView不保存文件或图像

django - 如何在基于类的通用 View 中访问RequestContext?

django - 在 Django 基于类的通用 View 中访问上下文对象

python - Django休息框架: Access to passed arguments from views in serializers

google-apps-script - 如何使用 Google 脚本调用 Django Rest 框架