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



在下面的例子中,我有两个具有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
}
]

这就是我被卡住的地方。如何将这两个标记组合起来,然后计算同时具有这两个标签的帖子对象的数量?

型号.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

序列化程序.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__'

我建议在Post模型中添加一个相关字段到ManyToMany关系中——从标记端调用多对多关系很容易。

tags=型号。ManyToManyField(标签,related_name="post_objects"(

您可以简单地在序列化程序中post_objects.count,而不是添加SerializerMethodField

class TagSerializer(serializers.ModelSerializer):
posts_objects = serializers.HiddenField()
posts = serializers.IntegerField(source="posts_objects.count", read_only=True)

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

在您的序列化程序中使用它.py get_posts

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

而不是

obj.post_set.all().count()

目前,我通过计算前端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 
}   
}   

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

def get_counter(self, obj):
counter=Post.objects.filter(tags=obj).count()
return counter

相关内容

  • 没有找到相关文章

最新更新