Django查询以检索符合相关表聚合条件的行

3 投票
1 回答
593 浏览
提问于 2025-04-18 18:55

我在处理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的任务,同时排除掉某些特定状态的分配。

撰写回答