Django Rest Framework:计数具有多个ManyToManyField值的对象数

问题描述 投票:0回答:2

在下面的示例中,我有两个具有ManyToMany关系的模型,我正在尝试计算与标签相关的帖子数。


有3个标签:体育,电影,健康共有3个职位:1个用于体育,1个用于电影和1个带有两个标签(体育和健康)的职位
我可以获取每个标签的帖子数量,如下所示:
[
    {
        "name": "Sports",
        "posts": 2
    },
    {
        "name": "Films",
        "posts": 1
    },
    {
        "name": "Health",
        "posts": 1
    }

]

我的要求是为标签的组合分别计算对象。因此,理想的输出是:

[
    {
        "name": "Sports",
        "posts": 1
    },
    {
        "name": "Films",
        "posts": 1
    },
    {
        "name": "Sports & Health",
        "posts": 1
    }

]

这是我被困住的地方。如何合并两个标签,然后计算同时具有这两个标签的发布对象的数量?

models.py

class Tag(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    tags = models.ManyToManyField(Tag)

    def __str__(self):
        return self.title

serializers.py

class TagSerializer(serializers.ModelSerializer):

    posts = serializers.SerializerMethodField()

    class Meta:
        model = Tag
        fields = ('name', 'posts')

    def get_posts(self, obj):
        posts = obj.post_set.all().count()
        return posts


class PostSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'
python django django-rest-framework django-serializer manytomanyfield
2个回答
0
投票

在您的serializers.py get_posts中使用它

Post.objects.filter(tags__in=[obj]).count()

代替

obj.post_set.all().count()


0
投票

[目前,我通过对前端API结果中每个标签的对象数量进行计数来设法找到可行的解决方案。它适合我的情况,因为返回的数据不是很大。

let tagDict = {}
let data = response.data
  for (let i = 0; i < data.length; i++) {
    let key = data[i].name
      if ( key in tagDict ) { 
          tagDict[key] += 1
        } else {
          tagDict[key] = 1 
        }   
    }   

将其标记为接受,直到出现更好的解决方案为止。

© www.soinside.com 2019 - 2024. All rights reserved.