Преобразование QuerySet в словарь без итерации в Python?

Я хотел бы сохранить определенные поля из объекта QuerySet в объект python (например, словарь), но мне интересно, возможно ли это сделать без циклов, по крайней мере явно, в Python?

Например, если содержание QuerySet следующее:

>> queryset.values_list('parents', 'children', 'x', 'y')
>> [('parent1', 'child1', 1.1, 1.03), ('parent1', 'child2', 1.4, 1.05), ('parent2', 'child1', 0.1, 0.2), ('parent2', 'child2', 1.3, 2.2)]

Теперь я хотел бы преобразовать это в словарь. Фактическая структура словаря имеет второстепенное значение, лишь бы в нем содержалась вся информация. Например:

d = {
  'child1': {
    'parent1' : [1.1, 1.03], 
    'parent2' : [0.1, 0.2], 
  ...
}

# or
d = {
  'parent1': {
    'child1': [1.1, 1.03], 
    'child2': [1.4, 1.05]
  ...
}

# or even: 
d = {
  'child1': [
    # parent1   # parent2
    (1.1, 1.03), (0.1, 0.2)
  ]
  ...
}

Конечно, я могу сделать это, если буду циклически просматривать набор запросов в Python, но действительно ли необходимо делать явный цикл for? Есть ли способ заполнить словарь непосредственно из набора запросов, подобно тому, как list(queryset) дает список?

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

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

Используйте сериализаторы:

from rest_framework import serializers
class SomeModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = SomeModel
        fields = "__all__"

SomeModelSerializer(instance).data

возвращает

{'auto_now_add': '2018-12-20T21:34:29.494827Z',
 'foreign_key': 2,
 'id': 1,
 'many_to_many': [2],
 'normal_value': 1,
 'readonly_value': 2}

Я думаю, что это решение имеет хорошую производительность.I trust Django REST Framework team :)

Вернуться на верх