Я определил User
класс, который (в конечном счете) наследуется от models.Model
. Я хочу получить список всех полей, определенных для этой модели. Например, phone_number = CharField(max_length=20)
. По сути, я хочу получить все, что унаследовано от Field
класса.
Я думал, что смогу получить их, воспользовавшись этим inspect.getmembers(model)
, но список, который он возвращает, не содержит ни одного из этих полей. Похоже, Django уже овладел классом, добавил все его магические атрибуты и вычеркнул то, что на самом деле было определено. Итак ... как я могу получить эти поля? Возможно, у них есть функция для извлечения их для своих внутренних целей?
django
django-models
mpen
источник
источник
Ответы:
Поскольку большинство ответов устарели, я постараюсь обновить вас в Django 2.2. Здесь posts- ваше приложение (записи, блог, магазин и т. Д.)
1) Из ссылки на модель : https://docs.djangoproject.com/en/2.2/ref/models/meta/.
Обратите внимание, что:
Также получатся некоторые отношения, которые, например, вы не сможете отобразить в представлении.
Как в моем случае:
и
2) Из экземпляра
3) От родительской модели
Давайте предположим, что у нас есть Post в качестве родительской модели, и вы хотите видеть все поля в списке, а родительские поля должны быть доступны только для чтения в режиме редактирования.
источник
clean_field_names = [str(h).split('.')[2].replace("_", " ").title() for h in all_fields]
all_fields = bp._meta.fields
Джанго версии 1.8 и позже:
Вы должны использовать
get_fields()
:Начиная с Django 1.8, этот
get_all_field_names()
метод устарел и будет удален в 1.10 .Страница документации, ссылка на которую приведена выше, обеспечивает полностью обратно совместимую реализацию
get_all_field_names()
, но для большинства целей предыдущий пример должен работать просто отлично.Джанго версии до 1.8:
Это должно делать свое дело.
Это требует фактического экземпляра модели. Если все, что у вас есть, это подкласс
django.db.models.Model
, то вам следует позвонитьmyproject.myapp.models.MyModel._meta.get_all_field_names()
источник
model._meta.fields
хотя, и их имена могут быть найдены сfield.name
этим, кажется. Я просто надеюсь, что это самый стабильный способ получить эту информацию :)django.db.models.Model
. Я покопаюсь в этом и посмотрю, что я смогу найти_meta
атрибут - это единственный способ ... Дополнительно_meta.many_to_many
изучите поля ManyToMany!get_all_related_fields()
Упомянутый здесь метод был устаревшим в версии 1.8 . Отныне этоget_fields()
.источник
Я считаю, что добавление этого к моделям Django весьма полезно:
Это позволяет вам делать:
источник
django.db.models.fields.related.RelatedObjectDoesNotExist: CustomModel has no custom_attribute.
ForeignKey
отлично работает для меня. Хотя, молча ловить все исключения - это анти-паттерн. Гораздо лучше пойматьAttributeError
или хотя бы записать, что какое-то исключение было тихо проглочено.self._meta.get_all_field_names()
был амортизирован и удален. Вы можете использовать что-то вроде,for field in self._meta.get_fields()
а затемyield (field.name, field.value_from_object(self))
Это делает трюк. Я проверяю это только в Django 1.7.
Model._meta.local_fields
не содержит много-много полей. Вы должны заставить их использоватьModel._meta.local_many_to_many
.источник
Не ясно, есть ли у вас экземпляр класса или самого класса и вы пытаетесь получить поля, но в любом случае рассмотрите следующий код
Использование экземпляра
Используя класс
источник
Это сработало для меня в
django==1.11.8
источник
MyModel._meta.get_all_field_names()
было отклонено несколько версий назад и удалено в Django 1.10.Вот обратная совместимость с документами :
источник
Просто добавлю, я использую объект self, это сработало для меня:
источник
По крайней мере с Django 1.9.9 - версией, которую я сейчас использую - обратите внимание, что на
.get_fields()
самом деле также «рассматривает» любую стороннюю модель как поле, что может быть проблематично. Скажем, у вас есть:Это следует из того
в то время как, как показывает @Rockallite
источник
Поэтому, прежде чем я нашел этот пост, я успешно нашел, что это работает.
Это работает так же, как
Я не уверен, какая разница в результатах, если таковые имеются. Я запустил этот цикл и получил тот же вывод.
источник
Почему бы просто не использовать это:
Пример вывода:
источник