2016-06-22 1 views
1

Предположим, у меня есть 2 таблицы в моей БД. Один из них называется Person, который имеет атрибуты 'name' и 'id', а другой называется Role, у которого есть атрибуты 'person' (который является внешним ключом к id в таблице Person) и 'id'. Теперь я хотел бы сделать запрос, который дал бы имя, такое как Дэвид, нашел всех лиц с таким именем и также возвращает связанные с ними Роли. Мы знаем, что каждое Лицо связано не более чем с одной ролью.django получить модель с внешним ключом

Я знаю, что не могу использовать Person.objects.filter(name=David).select_related('Role') Потому что Роль не является атрибутом человека. В любом случае, я могу получить это только с 1 ударом в БД?

ответ

1

Это на самом деле очень простой запрос, в отличие от некоторых других ответов. Следует помнить, что если вы хотите Роли, вы должны начать с модели ролей. Поэтому просто следуйте за отношениями назад оттуда:

Role.objects.filter(person__name='David') 
+0

Нет. Мне также нужен объект Person. В основном я ищу способ получить как Роль, так и Личность с 1 ударом в БД. –

+0

Затем добавьте 'select_related ('person')'. –

0

Чтобы получить человек, это, как вы уже писали:

Person.objects.filter(name='David') 

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

Role.objects.filter(person__name='David') 

Чтобы получить роли данного лица :

Role.objects.filter(person=person) 

Так что я понимаю из вашего вопроса, что вы хотите сделать что-то вроде этого:

for person in Person.objects.filter(name='David'): 
    person_roles = Role.objects.filter(person=person) 
    # ... 
    # do something with person_roles (that should contain 
    # at most one object according to your constraints). 
+0

Так что нет способа получить людей с именем David и связанные роли в одном запросе? –

+1

Нет: результат запроса должен быть сохранен в очень сложном объекте Python, если это было возможно ... – viron