Наборы запросов Django 1.11: Получить все объекты (экземпляры модели) из набора отношений - PullRequest
0 голосов
/ 11 июня 2018

Если есть модель для компаний.Эти компании имеют атрибут employment_set, поскольку работники назначаются компаниям через трудовые отношения.Как я могу запросить всех сотрудников для данной компании?Модель для сотрудников выглядит следующим образом:

class Employment(
    SoftDeletableModel,
    TimeStampedModel,
    models.Model
):
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    employee = models.ForeignKey(UserWorkerProfile)
    employed_by = models.ForeignKey(UserOwnerProfile)

Я пытался использовать company.employment_set.values("employee"), но это возвращает странный набор активаторных запросов.Есть ли способ вернуть нормальный набор запросов?Или values() уже правильный метод?

Редактировать: Чтобы еще немного выразить: я хочу закончить набором запросов, содержащим все экземпляры модели UserWorkerprofile.

В документации для values() он говорит:

Возвращает QuerySet, который возвращает словари, а не экземпляры модели, когда используется как итеративный.

, и я хочу точно набор запросов экземпляров модели.

1 Ответ

0 голосов
/ 12 июня 2018

Исходя из вашего комментария, вы хотите, чтобы все UserWorkerProfile s имели a (может быть ноль, один или несколько) связанных Employment экземпляров и Employment экземпляра.с Company (у каждого Employment есть точно один company) данной компании.

Мы можем запросить такие UserWorkingProfile s с помощью следующего запроса:

UserWorkingProfile.objects.filter(<b>employment__company=some_comany</b>)

Таким образом, этот набор запросов вернет все UserWorkingProfile с, для которых существует экземпляр Employment, который ссылается на данную компанию some_company и UserWorkingProfile.

В Django используются два последовательных подчеркивания для просмотра «сквозных» отношений (это можно использовать в двунаправленно , обратите внимание, что два последовательных подчеркивания используются для других вещей, помимо просмотра отношений).

Таким образом, мы написали запрос, более или менее похожий на:

SELECT `userworkingprofile`.*
FROM `userworkingprofile`
JOIN `employment` ON `employment`.`employee_id` = `userworkingprofile`.`id`
WHERE `employment`.`company_id` = 123

С 123 на самом деле pk из some_company.

Обратите внимание, что этоВозможно, что то же самое UserWorkingProfile встречается несколько раз в этом наборе запросов, если сотрудник работал sevВремя для some_company.

Если вы хотите, чтобы каждое UserWorkingProfile происходило не более один раз , вам следует добавить к нему .distinct():

UserWorkingProfile.objects.filter(employment__company=some_comany)<b>.distinct()</b>

Хотя Django действительно определяет диспетчер объектов с именем employment_set в экземпляре Company, насколько я знаю, вы не можете "объединить" два таких менеджера (поэтому <s>some_company.employment_set.employee</s> не будет не работать).

...