Подтвердить что ты не робот

Как подзапрос в queryset в django?

как я могу получить подзапрос в django queryset? например, если у меня есть:

select name, age from person, employee where person.id = employee.id and
employee.id in (select id from employee where employee.company = 'Private')

это то, что я сделал еще.

Person.objects.value('name', 'age')
Employee.objects.filter(company='Private')

но он не работает, потому что он возвращает два вывода...

4b9b3361

Ответ 1

ids = Employee.objects.filter(company='Private').values_list('id', flat=True)
Person.objects.filter(id__in=ids).values('name', 'age')

Ответ 2

как указано в ypercube, ваш прецедент не требует подзапроса.

но так или иначе, так как многие люди приземляются на эту страницу, чтобы узнать, как выполнить подзапрос здесь, как это делается.

employee_query = Employee.objects.filter(company='Private').only('id').all()
Person.objects.value('name', 'age').filter(id__in=employee_query)

Источник: http://mattrobenolt.com/the-django-orm-and-subqueries/

Ответ 3

Вы можете создавать подзапросы в Django, используя unevaluated queryset для фильтрации основного запроса. В вашем случае это будет выглядеть примерно так:

employee_query = Employee.objects.filter(company='Private')
people = Person.objects.filter(employee__in=employee_query)

Я предполагаю, что у вас есть обратная связь от Person до Employee с именем Employee. Я нашел полезным рассмотреть SQL-запрос, сгенерированный набором запросов, когда я пытался понять, как работают фильтры.

print people.query

Как говорили другие, вам действительно не нужен подзапрос для вашего примера. Вы можете просто присоединиться к таблице сотрудников:

people2 = Person.objects.filter(employee__company='Private')