Вы можете использовать следующее, вдохновленное django.forms.model_to_dict
.
. Оно извлекает поля из модели заданного набора запросов, затем выполняет итерацию по набору запросов и использует .values_from_object()
для извлечения значения поля для каждого экземпляра.
Ключ определяется с использованием f.verbose_name
вместо f.name
.
from itertools import chain
def queryset_to_dict(queryset, include=None, exclude=None):
"""
:param queryset: queryset of objects
:param include: return only the named fields in each instance dict
:param exclude: exclude the named from the instance dict even if listed in `fields`
:return: list of dicts
"""
opts = queryset.model._meta
fields = []
for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
if not getattr(f, 'editable', False):
continue
if include is not None and f.name not in include:
continue
if exclude and f.name in exclude:
continue
fields.append(f)
data = []
for instance in queryset:
instance_dict = {}
for f in fields:
key = f.verbose_name
instance_dict[key] = f.value_from_object(instance)
data.append(instance_dict)
return data
Пример использования:
queryset = Order.objects.filter(date_invoice__gte='2019-12-01')
data = queryset_to_dict(queryset, include=['id', 'date_invoice'])