【问题标题】:Django ORM - Join many-to-many with through tableDjango ORM - 通过表加入多对多
【发布时间】:2020-08-04 02:21:40
【问题描述】:

我有 3 个模型:

  • 任务:一项任务,可以分配给多个员工。
  • AssignedUser:(桥接表)存储分配给任务的员工
    • completed:表明employee是否已经完成了分配的任务。
  • 员工:一名员工,可以处理许多任务。 (Extends from Django's user model)
class Task(models.Model):
    name = models.CharField(max_length=50)
    detail = models.TextField()
    employees = models.ManyToManyField('Employee', through='AssignedUser', related_name='tasks')

class AssignedUser(models.Model):
    task = models.ForeignKey(task, on_delete=models.CASCADE)
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)
    completed = models.BooleanField(default=False)

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    department = models.ForeignKey(to=Department, on_delete=models.CASCADE, null=False)
    # Note - department field is not relevant to this question.

如果我想选择一个任务名称和尚未完成任务的已分配员工的用户名 (completed=False),我该如何使用 Django 的 ORM?

这是我为所需结果编写的等效 SQL,我不知道如何使用 Django 的 ORM 来实现。

SELECT t.name, u.username
FROM appname_task t
JOIN appname_assigneduser au
    ON (t.id = au.work_id AND au.completed = false)
JOIN appname_employee ae
    ON (au.employee_id = ae.id)
JOIN auth_user u
    ON (ae.user_id = u.id)

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    您可以通过以下方式获得:

    from django.db.models import F
    
    Task.objects.filter(assigneduser__completed=False).values(
        'name', username=F('employees__user__username')
    )

    【讨论】:

    • 感谢您的快速答复。请问您...您能解释一下F('employees__user__username') 部分吗?
    • F 指的是一个字段(列)。所以我们在这里指的是加入的employees 中的user 中的username
    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2020-02-13
    • 2019-09-08
    • 2016-09-05
    • 2019-08-13
    • 2014-08-18
    • 1970-01-01
    • 2019-04-22
    相关资源
    最近更新 更多