【问题标题】:Can I filter a parent model by occurences in a child model in django?我可以通过 django 中子模型中的出现来过滤父模型吗?
【发布时间】:2018-08-29 21:33:48
【问题描述】:

我有两个模型:

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?不确定这是否不是最好的方法,或者我只是想念如何跳过这一步。

编辑:在我看来,我可以通过循环遍历那些 Assignment 对象然后使用 __in 排除参数来填充一个空集 Tasks... 任何比这更好的方法?

【问题讨论】:

    标签: python sql django


    【解决方案1】:

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

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

    但是您不需要这样做。您可以使用双下划线符号来遵循从 assignment 到 worker 的关系:

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

    请注意,您可以改用多对多字段,Django 会为您创建连接表:

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

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

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

    【讨论】:

    • assignable_tasks = Task.objects.exclude(assignment__worker=worker) 美丽。不知何故,我没有意识到你可以遵循这样的孩子 - > 父母关系(在那个任务中是任务的孩子)。我不能使用 ManyToManyField,因为我还存储了在该表中分配任务的时间,这样如果没有未分配的任务,我可以回退到最旧的任务。非常感谢!
    • 您可以使用带有through 参数的多对多字段。请参阅extra fields on many-to-many relationships 上的文档。
    • 哦,完美 - 我可能会走那条路。感谢所有帮助。
    猜你喜欢
    • 2022-08-02
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多