连接2个Django查询集

我在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

感谢您的帮助!

yangx456 回答:连接2个Django查询集

您可以注释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

本文链接:https://www.f2er.com/3129365.html

大家都在问