Django ORM:获取一种字段类型的查询集
Django ORM: get queryset of one field type
我有一个模型 ProblemVote
,其中包含 user
(ForeignKey
)、problem
(ForeignKey
) 和 status
字段。我需要状态为 'AC' 和 'R'.
的所有问题(已投票)
我能够在 Python 列表中获取所有必需的问题。但是,我想知道是否有更好的方法使用查询集方法。
我的部分代码:
all_votes = ProblemVote.objects.filter(
user=user).select_related("problem").filter(problem__stage='PV')
all_votes_problems = [vote.problem for vote in all_votes]
accepted_problems = [vote.problem for vote in all_votes if vote.status == 'AC']
rejected_problems = [vote.problem for vote in all_votes if vote.status == 'R']
将问题作为查询集获取将帮助我找到 queryset.count()
的计数并找到 queryset.difference(another_queryset)
.
之类的查询集差异
如果我理解正确的话,你想要的实际上是一个 Problem
查询集而不是 ProblemVote
查询集?
如果是这样,您应该在过滤器中使用 Problem
模型和双下划线符号来获得您想要的内容。
类似于:
all_problems = Problem.objects.filter(stage='PV', vote__user=user)
accepted_problems = Problem.objects.filter(stage='PV', vote__user=user, vote__status='AC')
rejected_problems = Problem.objects.filter(stage='PV', vote__user=user, vote__status='R')
确保将过滤器调用中的 vote
更改为模型中实际存在的任何外键访问器(外键字段上的 related_name
属性)。
编辑:根据 Django 处理外键字段查询的方式更改了过滤器调用 here
我有一个模型 ProblemVote
,其中包含 user
(ForeignKey
)、problem
(ForeignKey
) 和 status
字段。我需要状态为 'AC' 和 'R'.
我能够在 Python 列表中获取所有必需的问题。但是,我想知道是否有更好的方法使用查询集方法。
我的部分代码:
all_votes = ProblemVote.objects.filter(
user=user).select_related("problem").filter(problem__stage='PV')
all_votes_problems = [vote.problem for vote in all_votes]
accepted_problems = [vote.problem for vote in all_votes if vote.status == 'AC']
rejected_problems = [vote.problem for vote in all_votes if vote.status == 'R']
将问题作为查询集获取将帮助我找到 queryset.count()
的计数并找到 queryset.difference(another_queryset)
.
如果我理解正确的话,你想要的实际上是一个 Problem
查询集而不是 ProblemVote
查询集?
如果是这样,您应该在过滤器中使用 Problem
模型和双下划线符号来获得您想要的内容。
类似于:
all_problems = Problem.objects.filter(stage='PV', vote__user=user)
accepted_problems = Problem.objects.filter(stage='PV', vote__user=user, vote__status='AC')
rejected_problems = Problem.objects.filter(stage='PV', vote__user=user, vote__status='R')
确保将过滤器调用中的 vote
更改为模型中实际存在的任何外键访问器(外键字段上的 related_name
属性)。
编辑:根据 Django 处理外键字段查询的方式更改了过滤器调用 here