Как отфильтровать ManyToMany набора запросов в django - PullRequest
0 голосов
/ 14 января 2020

У меня есть две модели, вопросы и ответы на них, и я хочу получить ВСЕ вопросы вместе с одиночным ответом на них, т. Е. Ответ, который имеет максимальное количество upvoters для этого вопроса. Как мне получить этот результат в наборе запросов (я буду разбивать его на страницы, поэтому наличие набора запросов облегчит процесс)

class Question(models.Model):
    question = models.CharField(max_length = 128)
    asker = models.ForeignKey(CustomUser, on_delete = models.CASCADE, related_name="asked_questions")
    requested = models.ManyToManyField(CustomUser, related_name="answer_requests")
    followers = models.ManyToManyField(CustomUser, related_name="followed_questions")
    topics = models.ManyToManyField(Topic, related_name="questions")
    url = models.CharField(max_length = 150)
    created_at = models.DateTimeField(auto_now_add = True, blank = True)


    def __str__(self):
        return self.question

class Answer(models.Model):
    answer = models.TextField()
    author = models.ForeignKey(CustomUser, on_delete = models.CASCADE, related_name="written_answers")
    question = models.ForeignKey(Question, on_delete = models.CASCADE, related_name="answers")
    upvoters = models.ManyToManyField(CustomUser, related_name="upvoted_answers")
    created_at = models.DateTimeField(auto_now_add = True, blank = True)

1 Ответ

3 голосов
/ 14 января 2020

Попробуйте, используя subquery expression

from django.db.models import Count, Subquery, OuterRef

answer_subquery = Answer.objects.filter(question=OuterRef('pk')).annotate(upvotes=Count('upvoters')).order_by('-upvotes')

questions = Question.objects.annotate(answer=Subquery(answer_subquery.values('answer')[:1]))
...