我可以通过django中的子模型中的出现来过滤父模型吗?

时间:2018-03-20 22:07:09

标签: python sql django

我有两种模式:

class User(models.Model):
    # stuff


class Task(models.Model):
    # stuff

在为用户分配新任务时,我希望避免分配工人之前获得的任务。我尝试采用的方法是添加第三个模型Assignment,用于跟踪分配给给定用户的任务:

class Assignment(models.Model):
    worker = models.ForeignKey(User)
    task = models.ForeignKey(Task)

但是,如何基于此形成查询呢?我的想法是从被分配给用户的过滤分配开始,但是在那之后我就陷入了困境。

def get_tasks(worker):
    previous_assignments = Assignment.objects.filter(worker=worker)
    # then something like...
    assignable_tasks = Task.objects.exclude(pk__in=previous_assignments.task)  #clearly wrong

有没有办法访问previous_assignments查询集中的任务ID?不确定这不是最好的方法,或者我是否只是错过了如何超越这一步。

编辑:我可以通过遍历这些Task对象然后使用Assignment排除参数来填充__in个空集。像上面那样...还有比这更好的方法吗?

1 个答案:

答案 0 :(得分:1)

要使用pk_in排除,您需要排除任务ID的列表或查询集。例如,您可以这样做:

previous_assignments = Assignment.objects.filter(worker=worker).values_list('task_id')
assignable_tasks = Task.objects.exclude(pk__in=previous_assignments)

但是你不需要这样做。您可以使用双下划线表示法来遵循从赋值到工作者的关系:

assignable_tasks = Task.objects.exclude(assignment__worker=worker)

请注意,您可以使用多对多字段,Django将负责为您创建连接表:

class Task(models.Model):
    users = models.ManyToManyField(User)

在这种情况下,您的查询将变为:

assignable_tasks = Task.objects.exclude(users=worker)