172 votes

Récupérer les champs du modèle dans Django

Étant donné un modèle Django, j'essaie de lister tous ses champs. J'ai vu quelques exemples pour faire cela en utilisant l'attribut de modèle _meta, mais le trait de soulignement devant meta n'indique-t-il pas que l'attribut _meta est un attribut privé et qu'il ne faut pas y accéder directement ? ... Parce que, par exemple, la disposition de _meta pourrait changer à l'avenir et ne pas constituer une API stable ?

Est-ce que _meta est une exception à cette règle ? Est-il stable et prêt à être utilisé ou est-il considéré comme une mauvaise pratique d'y accéder ? Ou existe-t-il une fonction ou un autre moyen d'introspecter les champs d'un modèle sans utiliser l'attribut _meta ? Vous trouverez ci-dessous une liste de liens montrant comment procéder en utilisant l'attribut _meta.

Tout conseil est le bienvenu.

champ get/set d'un objet django

http://www.djangofoo.com/80/get-list-model-fields

Comment introspecter les champs d'un modèle django ?

0 votes

6voto

jxqz Points 31

Les champs du modèle contenus dans _meta sont répertoriés à plusieurs endroits sous forme de listes des objets de champ respectifs. Il peut être plus facile de travailler avec eux sous la forme d'un dictionnaire dont les clés sont les noms des champs.

À mon avis, c'est la manière la plus irrédentiste et la plus expressive de collecter et d'organiser les objets du champ de modèle :

def get_model_fields(model):
  fields = {}
  options = model._meta
  for field in sorted(options.concrete_fields + options.many_to_many + options.virtual_fields):
    fields[field.name] = field
  return fields

(Voir Cet exemple d'utilisation dans django.forms.models.fields_for_model.)

2 votes

Vous pouvez accompagner votre code d'une brève description de ce qu'il fait.

2voto

JDE876 Points 387

Que dites-vous de celle-là.

fields = Model._meta.fields

2voto

Dennis Points 600

Si vous en avez besoin pour votre admin il y a aussi le ModelAdmin.get_fields méthode ( docs ), qui renvoie un list du nom du champ strings .

Par exemple :

class MyModelAdmin(admin.ModelAdmin):
    # extending change_view, just as an example
    def change_view(self, request, object_id=None, form_url='', extra_context=None):
        # get the model field names
        field_names = self.get_fields(request)
        # use the field names
        ...

2voto

Selon la documentation de django 2.2, vous pouvez utiliser :

Pour obtenir tous les champs : Model._meta.get_fields()

Pour obtenir un champ individuel : Model._meta.get_field('field name')

ex. Session._meta.get_field('expire_date')

0voto

Thomas Turner Points 899

Une autre façon est d'ajouter des fonctions au modèle et lorsque vous voulez remplacer la date, vous pouvez appeler la fonction.

class MyModel(models.Model):
    name = models.CharField(max_length=256)
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def set_created_date(self, created_date):
        field = self._meta.get_field('created')
        field.auto_now_add = False
        self.created = created_date

    def set_modified_date(self, modified_date):
        field = self._meta.get_field('modified')
        field.auto_now = False
        self.modified = modified_date

my_model = MyModel(name='test')
my_model.set_modified_date(new_date)
my_model.set_created_date(new_date)
my_model.save()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X