Объединение 2 наборов запросов Django - PullRequest
1 голос
/ 10 ноября 2019

Я сделал 2 набора запросов в django, которые объединяют фильтры и счетчики, и мне нужно найти способ присоединиться к ним.

Модели выглядят так:

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'))

Я хочу вывод, который имеет этот формат:

joke_id, joke_text, NumberOfLikes, NumberOfDislikes

Любая помощь приветствуется!

1 Ответ

1 голос
/ 10 ноября 2019

Вы можете аннотировать объект 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...