Python Django查询以检索满足相关表上聚合条件的行

Python Django查询以检索满足相关表上聚合条件的行,python,django,Python,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' ), (

我真的被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]

任何帮助都将不胜感激

从django.db.models导入计数


Task.objects.excludeassignments\uu status='r'。annotateassignments\u count=count'assignments.filterassignments\u count\uu gt=N

您考虑过Q对象吗?它们可以让您创建更复杂的查询表达式——我有,但我不知道如何创建进行聚合的Q对象。当我这么说的时候,我觉得自己很傻,但在这种情况下,我就是无法控制自己。是的,我明白。我很想看看你的解决方案!根据下面的解决方案,诀窍是将虚拟列计数添加到查询中,然后对该列进行筛选。就是这样,谢谢!顺便说一句,您错过了一个参数:Task.objects.excludeAignments\uuu status='r'。annotateassignments\u count=count'assignments'。filterasignments\u count\uu gt=N