Получить внешний ключ без запроса всего объекта - PullRequest
0 голосов
/ 25 января 2009

У меня есть модель Foo, которая имеет ForeignKey для модели User.

Позже мне нужно получить все идентификаторы пользователя и поместить их в список

foos = Foo.objects.filter(...)

l = [ f.user.id for f in foos ]

Но когда я это делаю, django получает весь экземпляр User из БД, а не просто числовой идентификатор пользователя, который существует в каждой строке Foo.

Как я могу получить все идентификаторы, не запрашивая каждого пользователя или используя select_related?

Спасибо

Ответы [ 3 ]

5 голосов
/ 25 января 2009

Используйте функцию values ​​() набора запросов , которая будет возвращать список словарей, содержащих пары имя / значение для каждого атрибута, переданного в качестве параметров:

>>> Foo.objects.all().values('user__id')
[{'user__id': 1}, {'user__id' 2}, {'user__id': 3}]

Затем ORM сможет оптимизировать SQL-запрос, чтобы он возвращал только обязательные поля, вместо того, чтобы выполнять «SELECT *».

3 голосов
/ 28 января 2009

Всякий раз, когда вы определяете ForeignKey в Django, он автоматически добавляет поле FIELD_id в вашу модель.

Например, если Foo имеет FK для User с атрибутом с именем "user", то у вас также есть атрибут с именем user_id , который содержит идентификатор соответствующего пользователя.

l = [ f.user_id for f in foos ]

Вызов .values() также повышает производительность, если вы правильно выбираете атрибуты

0 голосов
/ 25 января 2009

Не важно ... Я не уверен, почему это не сработало раньше, когда я пытался, но вот как это сделать:

l = [ f.user_id for f in foos ]
...