我在django中制作了2个查询集,这些查询集将过滤器和计数结合在一起,我需要找到一种方法将它们结合在一起。
模型如下:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Jokes(models.Model):
user_id = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.TextField()
date = models.DateTimeField()
class Likes(models.Model):
user_id = models.ForeignKey(User, on_delete=models.CASCADE)
joke_id = models.ForeignKey(Jokes, on_delete=models.CASCADE)
dislike = models.BooleanField()
class Meta:
unique_together = ('user_id', 'joke_id',)
查询如下:
jokeLikes = Likes.objects.filter(dislike = False).select_related('joke_id')
jokeDislikes = Likes.objects.filter(dislike = True).select_related('joke_id')
countLikes = jokeLikes.values('joke_id__id', 'joke_id__text').annotate(Count('joke_id__id'))
countDislikes = jokeDislikes.values('joke_id__id','joke_id__text').annotate(Count('joke_id__id'))
我想要具有以下格式的输出:
笑话ID,笑话文本,NumberOfLikes,NumberOfDislikes
感谢您的帮助!
答案 0 :(得分:1)
您可以注释Jokes
对象:
from django.db.models import Count, Sum, Value
from django.db.models.functions import Coalesce
Jokes.objects.annotate(
number_of_likes=Coalesce(Count('likes')-Sum('likes__dislikes'), Value(0)),
number_of_dislikes=Coalesce(Sum('likes__dislike'), Value(0))
)
这将返回一个Jokes
的查询集,对此查询集产生的每个Jokes
对象将具有两个额外的属性:.number_of_likes
和.number_of_dislikes
,其中包含相关的喜欢和不喜欢的次数。
注意:通常,Django模型的名称为单数,因此
Joke
代替了,和Jokes
Like
而不是。Likes