如何在 Django 中过滤查询集的 ManyToMany
How to filter the ManyToMany of a queryset in django
我有两个模型、问题及其答案,我想获取 所有问题 以及对它们的单一答案,即,该问题的支持者人数达到 上限 。我如何在查询集中获取此结果(我将对结果进行分页,因此拥有查询集将简化流程)
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)
像这样使用 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]))
我有两个模型、问题及其答案,我想获取 所有问题 以及对它们的单一答案,即,该问题的支持者人数达到 上限 。我如何在查询集中获取此结果(我将对结果进行分页,因此拥有查询集将简化流程)
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)
像这样使用 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]))