Фильтр для использования элементов существует через обратную связь внешнего ключа - PullRequest
3 голосов
/ 20 апреля 2011

Соответствующее изображение моей модели здесь: http://i.stack.imgur.com/xzsVU.png

Мне нужно создать набор запросов, который содержит всех кошек, у которых есть связанный человек с ролью «владелец» и именем «боб».

sql для этого будет показано ниже.

select * from cat where exists 
(select 1 from person inner join role where 
person.name="bob" and role.name="owner");

Эта проблема может быть решена в двух запросах sql со следующими фильтрами django.

people = Person.objects.filter(name="bob", role__name="owner")
ids = [p.id for p in people]
cats = Cat.objects.filter(id__in=ids)

Моя фактическая установка более сложна, чем эта, и имеет дело с большим набором данных. Есть ли способ сделать это с помощью одного запроса? Если это невозможно, какова эффективная альтернатива?

1 Ответ

5 голосов
/ 20 апреля 2011

Я почти уверен, что это ваш запрос:

cats = Cat.objects.filter(person__name='bob', person__role__name='owner')

читайте здесь о look ups spanning relationships

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...