Преобразование 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 :)