我有两种模式:
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
个空集。像上面那样...还有比这更好的方法吗?
答案 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)