Как совместить select_related() и value()? (2016)

Я снова задаю этот вопрос ( он был задан еще в 2009 году),

Мы знаем, что есть values() Метод QuerySet, когда есть посторонний ключ (например, автор), он выглядит так:

[{ 'author_id':3, ... }, ...]

Я хочу результат как:

[{ 'author':{'name':'dave',...}, ... }, ...]

Что-то изменилось в новых версиях Django?

Я хочу преобразовать набор запросов в комбинацию списков и словарей, это возможно?

Затем я возьму этот объект и помещу его в более крупный объект для его сериализации. Это причина, почему я не хочу сериализовать это сразу.

1 ответ

Решение

Вы можете получить доступ к соответствующим полям через values() без необходимости использовать select_related() (только они будут получены без последующего поиска):

MyModel.objects.values('author__id', 'author__name')

Это вернет следующую структуру:

[{'author__id': 1, 'author__name': 'Dave'}, {...}]

Если вам это нужно во вложенной структуре, вам придется преобразовать ее потом.

Обратите внимание, что для отношений M2M это возвращает одну запись списка на отношение M2M, поэтому, вероятно, нежелательный эффект. Но для отношений OneToOne/ForeignKey это работает просто отлично.

Другие вопросы по тегам