Учитывая модель Django, я пытаюсь перечислить все ее поля. Я видел несколько примеров этого с использованием атрибута модели _meta, но разве подчеркивание перед мета не означает, что атрибут _meta является частным атрибутом и к нему нельзя обращаться напрямую? ... Потому что, например, макет _meta может измениться в будущем и не будет стабильным API?
_Meta - исключение из этого правила? Он стабилен и готов к использованию или доступ к нему считается плохой практикой? Или есть функция или какой-то другой способ изучить поля модели без использования атрибута _meta? Ниже приведен список некоторых ссылок, показывающих, как это сделать с помощью атрибута _meta.
Любой совет очень ценится.
Поле получения / установки объекта django
Ответы:
_meta
является частным, но относительно стабильным. Есть попытки формализовать это, задокументировать и убрать подчеркивание, что могло произойти до 1.3 или 1.4. Я предполагаю, что будут предприняты усилия для обеспечения обратной совместимости, потому что многие люди все равно использовали его.Если вас особенно беспокоит совместимость, напишите функцию, которая принимает модель и возвращает поля. Это означает, что если что-то изменится в будущем, вам нужно будет изменить только одну функцию.
Я считаю, что это вернет список
Field
объектов. Чтобы получить значение каждого поля из экземпляра, используйтеgetattr(instance, field.name)
.Обновление: участники Django работают над API, чтобы заменить объект _Meta как часть Google Summer of Code. См .:
- https://groups.google.com/forum/#!topic/django-developers/hD4roZq0wyk
- https://code.djangoproject.com/wiki/new_meta_api
источник
model._meta.many_to_many
!django/core/management/commands/loaddata.py
использует _meta для просмотра дерева приложений, моделей и полей. Хороший образец для подражания ... и можете поспорить, что это «официальный путь»._meta.virtual_fields
_meta
теперь формальный, поддерживаемый API (новый в Django 1.8)Я знаю, что этот пост довольно старый, но я просто хотел сказать всем, кто ищет то же самое, что для этого есть публичный и официальный API:
get_fields()
иget_field()
Использование:
https://docs.djangoproject.com/en/1.8/ref/models/meta/
источник
get_fields()
docs.djangoproject.com/en/1.10/ref/models/meta/..._meta
контролем?Теперь есть специальный метод - get_fields ()
Он принимает два параметра, которые можно использовать для управления возвращаемыми полями:
include_parents
Верно по умолчанию. Рекурсивно включает поля, определенные в родительских классах. Если установлено значение False, get_fields () будет искать только поля, объявленные непосредственно в текущей модели. Поля из моделей, которые напрямую наследуются от абстрактных моделей или прокси-классов, считаются локальными, а не родительскими.
include_hidden
По умолчанию - false. Если установлено значение True, get_fields () будет включать поля, которые используются для поддержки функций других полей. Это также будет включать любые поля, у которых есть related_name (например, ManyToManyField или ForeignKey), которые начинаются со знака «+»
источник
get_fields()
возвращает a,tuple
и каждый элемент являетсяModel field
типом, который нельзя использовать напрямую как строку. Итак,field.name
вернем имя поляmy_model_fields = [field.name for field in MyModel._meta.get_fields()]
Приведенный выше код вернет список, содержащий все имена полей.
Пример
источник
Это то, что делает сам Django при построении формы из модели. Он использует атрибут _meta, но, как заметил Бернхард, он использует как _meta.fields, так и _meta.many_to_many. Глядя на django.forms.models.fields_for_model, вы можете сделать это следующим образом:
источник
Поля модели, содержащиеся в _meta, перечислены в нескольких местах в виде списков соответствующих объектов поля. Возможно, с ними будет проще работать как со словарем, где ключи - это имена полей.
На мой взгляд, это наиболее неизбыточный и выразительный способ сбора и организации объектов поля модели:
(См. Этот пример использования в django.forms.models.fields_for_model.)
источник
Как насчет этого.
источник
many_to_many
иvirtual_fields
.В соответствии с документацией django 2.2 вы можете использовать:
Чтобы получить все поля:
Model._meta.get_fields()
Чтобы получить отдельное поле:
Model._meta.get_field('field name')
ех.
Session._meta.get_field('expire_date')
источник
Если вам это нужно для вашего административного сайта, есть также
ModelAdmin.get_fields
метод ( docs ), который возвращаетlist
имя поляstrings
.Например:
источник
Другой способ - добавить функции в модель, и если вы хотите переопределить дату, вы можете вызвать функцию.
источник