Django: аннотировать список связанных полей

У меня есть модели Company и User со связанной моделью CompanyRecruiter:

class CompanyRecruiter(models.Model):

    organization = models.ForeignKey(Company, related_name="company_recruiters")
    recruiter = models.ForeignKey(User, related_name="company_recruiters")

Я хочу аннотировать список идентификаторов пользователей, которые являются рекрутерами для компаний, чтобы иметь возможность фильтровать их позже:

Company.objects.annotate(some_stuff=some_other_stuff).values_list("user_ids", flat=True)
# [ [1, 2], [1, 56], [] ]

Я уже безуспешно пытался использовать пользовательские агрегаты и подзапросы. Я использую постгрес.


person Martin Faucheux    schedule 18.05.2020    source источник


Ответы (1)


Если вам нужен вывод, аналогичный закомментированному разделу в вашем примере кода, вам, вероятно, следует запросить модель CompanyRecruiter:

recruiters = CompanyRecruiter.objects.values_list('organization', 'recruiter')
recruiter_list = [[o, r] for o, r in recruiters]

Однако в комментариях вы указали, что хотите конкретно запросить модель Company. Вы должны иметь возможность сделать это с помощью функции агрегирования Postgresql ArrayAgg :

Company.objects.annotate(recruiter_ids=ArrayAgg('company_recruiters__recruiter'))
person MattRowbum    schedule 18.05.2020
comment
Мне нужно применить аннотацию к набору запросов компании. Запрос таблицы CompanyRecruiter заставил бы меня сделать 2 вызова БД, и я хотел бы сохранить все в одном, чтобы быть эффективным. - person Martin Faucheux; 19.05.2020