Как сериализовать поле модели verbose_name - PullRequest
0 голосов
/ 14 января 2020

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

В настоящее время я использую этот подход для создания dict имен и значений полей:

views.py

from django.core import serializers
data = serializers.serialize( "python", SomeModel.objects.all() )

template. html

{% for instance in data %}
    {% for field, value in instance.fields.items %}
        {{ field }}: {{ value }}
    {% endfor %}
{% endfor %}

Это вернет поле, но не поле verbose_name. Например, для пользовательской модели is_active не возвращается как Is the user active?.

Есть ли способ также сериализовать подробное имя?

1 Ответ

0 голосов
/ 15 января 2020

Вы можете использовать следующее, вдохновленное 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'])
...