He definido una User
clase que (en última instancia) hereda de models.Model
. Quiero obtener una lista de todos los campos definidos para este modelo. Por ejemplo, phone_number = CharField(max_length=20)
. Básicamente, quiero recuperar cualquier cosa que herede de la Field
clase.
Pensé que podría recuperarlos aprovechando inspect.getmembers(model)
, pero la lista que devuelve no contiene ninguno de estos campos. Parece que Django ya se ha apoderado de la clase y ha agregado todos sus atributos mágicos y ha eliminado lo que realmente se ha definido. Entonces ... ¿cómo puedo obtener estos campos? ¿Probablemente tienen una función para recuperarlos para sus propios fines internos?
django
django-models
mpen
fuente
fuente
Respuestas:
Como la mayoría de las respuestas están desactualizadas, intentaré actualizarlo en Django 2.2 Aquí publica su aplicación (publicaciones, blog, tienda, etc.)
1) Desde el enlace del modelo : https://docs.djangoproject.com/en/2.2/ref/models/meta/
Tenga en cuenta que:
También obtendrá algunas relaciones, que, por ejemplo: no puede mostrar en una vista.
Como en mi caso:
y
2) De instancia
3) Del modelo principal
Supongamos que tenemos Publicar como modelo principal y desea ver todos los campos en una lista, y que los campos principales sean de solo lectura en el modo Edición.
fuente
clean_field_names = [str(h).split('.')[2].replace("_", " ").title() for h in all_fields]
all_fields = bp._meta.fields
Django versiones 1.8 y posteriores:
Debes usar
get_fields()
:El
get_all_field_names()
método está en desuso a partir de Django 1.8 y se eliminará en 1.10 .La página de documentación vinculada anteriormente proporciona una implementación totalmente compatible con versiones anteriores
get_all_field_names()
, pero para la mayoría de los propósitos, el ejemplo anterior debería funcionar bien.Versiones de Django anteriores a la 1.8:
Eso debería hacer el truco.
Eso requiere una instancia de modelo real. Si todo lo que tiene es una subclase de
django.db.models.Model
, entonces debe llamarmyproject.myapp.models.MyModel._meta.get_all_field_names()
fuente
model._meta.fields
embargo, esto parece estar disponible , y sus nombres se pueden recuperar confield.name
él. Solo espero que esta sea la forma más estable de recuperar esta información :)django.db.models.Model
. Lo_meta
atributo es la única forma ... ¡Además, busca los_meta.many_to_many
campos ManyToMany!El
get_all_related_fields()
método mencionado aquí ha quedado en desuso en 1.8 . De ahora en adelante lo esget_fields()
.fuente
Me parece útil agregar esto a los modelos de django:
Esto te permite hacer:
fuente
django.db.models.fields.related.RelatedObjectDoesNotExist: CustomModel has no custom_attribute.
ForeignKey
funciona bien para mi Aunque, capturar en silencio todas las excepciones es un antipatrón. Mucho mejor para atraparAttributeError
, o al menos registrar que alguna excepción se tragó en silencio.self._meta.get_all_field_names()
ha sido depreciado y eliminado. Puede usar algo comofor field in self._meta.get_fields()
y luegoyield (field.name, field.value_from_object(self))
Esto hace el truco. Solo lo pruebo en Django 1.7.
Model._meta.local_fields
no contiene campos de muchos a muchos. Deberías usarlosModel._meta.local_many_to_many
.fuente
No está claro si tiene una instancia de la clase o la clase en sí misma e intenta recuperar los campos, pero de cualquier manera, considere el siguiente código
Usando una instancia
Usando una clase
fuente
Esto funcionó para mí en
django==1.11.8
fuente
MyModel._meta.get_all_field_names()
Se desaprobó varias versiones y se eliminó en Django 1.10.Aquí está la sugerencia de los documentos compatible con versiones anteriores :
fuente
Solo para agregar, estoy usando un objeto propio, esto funcionó para mí:
fuente
Al menos con Django 1.9.9 , la versión que estoy usando actualmente, tenga en cuenta que en
.get_fields()
realidad también "considera" cualquier modelo extraño como un campo, lo que puede ser problemático. Digamos que tienes:Resulta que
mientras, como lo muestra @Rockallite
fuente
Entonces, antes de encontrar esta publicación, encontré que funcionaba con éxito.
Funciona igualmente como
No estoy seguro de cuál es la diferencia en los resultados, si hay uno. Ejecuté este bucle y obtuve el mismo resultado.
fuente
¿Por qué no solo usar eso?
Salida de ejemplo:
fuente