【问题标题】:How to filter the ManyToMany of a queryset in django如何在 django 中过滤查询集的多对多
【发布时间】:2020-04-30 20:00:46
【问题描述】:

我有两个模型,问题及其答案,我想获取所有问题以及一个单一答案,即具有该问题的支持者人数上限。如何在 Queryset 中获取此结果(我将对结果进行分页,以便使用 queryset 来简化流程)

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)

【问题讨论】:

    标签: python django many-to-many django-queryset


    【解决方案1】:

    使用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]))
    

    【讨论】:

    • 超级有帮助。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2017-07-15
    • 2018-01-05
    • 2013-08-18
    • 2018-12-01
    • 2015-02-17
    • 2018-01-03
    相关资源
    最近更新 更多