Django查询以检索符合相关表聚合条件的行
我在处理Django查询时遇到了麻烦,希望你能花点时间帮我解决这个问题。
我有一个非常简单的模型:
class Task(models.Model):
# a tuple representing a specific item to be searched for a specific URL
instructions = models.TextField()
ASSIGNMENT_STATUS_CHOICES = (
( 'a', 'assigned' ),
( 'c', 'submitted for review' ),
( 'f', 'finished' ),
( 'r', 'rejected' ),
)
class Assignment(models.Model):
# the overall container representing a collection of terms for a page found
# by a user
user = models.ForeignKey(User)
task = models.ForeignKey(Task, related_name='assignments')
status = models.CharField(max_length=1, choices=ASSIGNMENT_STATUS_CHOICES, default='a')
我想做的是随机选择一个任务,这个任务的分配数量少于N,并且状态不是'r'。换句话说,我想确保每个任务能成功完成N次,所以如果一个工作者请求一个任务,他需要的是一个在可以完成的状态下,分配数量少于N的任务。
我完全搞不清楚该怎么写查询才能返回这样的任务。对于给定的任务,我可以测试:
task.assignments.exclude(status='r').count() < N
如果这个条件成立,那它就是一个候选任务。但是,我该如何查询Task.objects,以便一次性返回所有候选任务,这样我就可以随机选择一个呢:
Task.objects.<some magic filter>.order_by('?')[0]
任何帮助都将不胜感激!
1 个回答
2
这段代码是用来处理Django框架中的数据库查询的。
首先,它从数据库中获取一个叫做“Task”的对象。接着,它排除了那些“assignments”状态为'r'的任务,也就是说,不考虑那些状态为'r'的分配。
然后,它对每个任务进行统计,计算与之相关的“assignments”的数量,并把这个数量命名为“assignments_count”。最后,它还会筛选出那些“assignments_count”大于N的任务。
简单来说,这段代码的目的是找出那些分配数量超过N的任务,同时排除掉某些特定状态的分配。