J'ai défini une User
classe dont (finalement) hérite models.Model
. Je veux obtenir une liste de tous les champs définis pour ce modèle. Par exemple phone_number = CharField(max_length=20)
,. Fondamentalement, je veux récupérer tout ce qui hérite de la Field
classe.
J'ai pensé que je pourrais les récupérer en profitant de inspect.getmembers(model)
, mais la liste qu'il renvoie ne contient aucun de ces champs. Il semble que Django ait déjà saisi la classe et ajouté tous ses attributs magiques et supprimé ce qui a été réellement défini. Alors ... comment puis-je obtenir ces champs? Ils ont probablement une fonction pour les récupérer à leurs propres fins internes?
django
django-models
mpen
la source
la source
Réponses:
Comme la plupart des réponses sont obsolètes, j'essaierai de vous mettre à jour sur Django 2.2 Voici les articles - votre application (articles, blog, boutique, etc.)
1) Depuis le lien du modèle : https://docs.djangoproject.com/en/2.2/ref/models/meta/
Notez que:
Obtiendra également quelques relations, qui, par exemple: vous ne pouvez pas afficher dans une vue.
Comme dans mon cas:
et
2) De l'instance
3) Du modèle parent
Supposons que nous ayons Post comme modèle parent et que vous souhaitiez voir tous les champs dans une liste et que les champs parents soient en lecture seule en mode Édition.
la source
clean_field_names = [str(h).split('.')[2].replace("_", " ").title() for h in all_fields]
all_fields = bp._meta.fields
Django versions 1.8 et supérieures:
Vous devez utiliser
get_fields()
:La
get_all_field_names()
méthode est obsolète à partir de Django 1.8 et sera supprimée en 1.10 .La page de documentation liée ci-dessus fournit une implémentation entièrement compatible en amont de
get_all_field_names()
, mais pour la plupart des cas, l'exemple précédent devrait très bien fonctionner.Versions de Django antérieures à 1.8:
Cela devrait faire l'affaire.
Cela nécessite une instance de modèle réelle. Si tout ce que vous avez est une sous-classe de
django.db.models.Model
, alors vous devez appelermyproject.myapp.models.MyModel._meta.get_all_field_names()
la source
model._meta.fields
cependant, et leurs noms sont récupérables avecfield.name
il semble. J'espère juste que c'est le moyen le plus stable pour récupérer ces informations :)django.db.models.Model
. Je vais creuser et voir ce que je peux trouver_meta
attribut est le seul moyen ... En outre, recherchez les_meta.many_to_many
champs ManyToMany!La
get_all_related_fields()
méthode mentionnée ici est déconseillée en 1.8 . À partir de maintenant, c'estget_fields()
.la source
Je trouve cela utile pour les modèles django:
Cela vous permet de faire:
la source
django.db.models.fields.related.RelatedObjectDoesNotExist: CustomModel has no custom_attribute.
ForeignKey
fonctionne bien pour moi. Cependant, la capture silencieuse de toutes les exceptions est un anti-modèle. Il vaut mieux attraperAttributeError
, ou du moins noter qu'une exception a été avalée en silence.self._meta.get_all_field_names()
a été amorti et supprimé. Vous pouvez utiliser quelque chose comme çafor field in self._meta.get_fields()
et ensuiteyield (field.name, field.value_from_object(self))
Cela fait l'affaire. Je le teste uniquement dans Django 1.7.
Model._meta.local_fields
ne contient pas de champs plusieurs-à-plusieurs. Vous devriez les faire utiliserModel._meta.local_many_to_many
.la source
Il n'est pas clair si vous avez une instance de la classe ou de la classe elle-même et que vous essayez de récupérer les champs, mais de toute façon, considérez le code suivant
Utiliser une instance
Utiliser une classe
la source
Cela a fonctionné pour moi dans
django==1.11.8
la source
MyModel._meta.get_all_field_names()
a été déconseillé plusieurs versions en arrière et supprimé dans Django 1.10.Voici la suggestion de compatibilité descendante des documents :
la source
Juste pour ajouter, j'utilise l'auto-objet, cela a fonctionné pour moi:
la source
Au moins avec Django 1.9.9 - la version que j'utilise actuellement -, notez qu'en
.get_fields()
fait "considère" également tout modèle étranger comme un champ, ce qui peut être problématique. Dites que vous avez:Il s'ensuit que
tandis que, comme le montre @Rockallite
la source
Donc, avant de trouver ce post, j'ai réussi à le trouver.
Cela fonctionne aussi bien que
Je ne sais pas quelle est la différence dans les résultats, s'il y en a un. J'ai exécuté cette boucle et obtenu la même sortie.
la source
Pourquoi ne pas simplement utiliser cela:
Exemple de sortie:
la source