Django ORM - Присоединяйтесь ко многим ко многим со сквозным столом - PullRequest
2 голосов
/ 21 апреля 2020

У меня есть 3 модели:

  • Задача : Задача, которая может быть назначена многим сотрудникам.
  • AssignedUser : ( Таблица мостов) Храните сотрудников, назначенных для задач
    • completed: укажите, выполнил ли employee назначенную задачу.
  • Сотрудник Сотрудник может работать над многими задачами. ( Расширяется от модели пользователя Django )
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)

1 Ответ

2 голосов
/ 21 апреля 2020

Вы можете получить это с:

from django.db.models import F

Task.objects.filter(<b>assigneduser__completed=False</b>).values(
    'name', username=F('employees__user__username')
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...