Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Comment declarer des attributs dans un model Django en uttilisant la fonction setattr()

0 votes

Je voudrais ajouter des champs a un model Django en utilisant la methode setattr au lieu de les declarer directement lors de la definition de mon model.

admettons que j'ai une app myapp et un model Foo defini de la maniere suivante:

myapp
└── models
    ├── foo.py
    └── __init__.py

Je voudrais pouvoir faire quelque chose du style:

from django.db import models

class Foo(models.Model):
    pass

setattr(Foo, bar, models.CharField(max_length=100))

Ca ne fonctionne pas, la colonne bar n'ai pas rajouter a la DB si je tente de faire une migration.

J'ai essaye egalement de mettre l'appel de la fonction setattr dans init.py, juste apres l'import de la class Foo mais cela ne fonctionne pas non plus.

Je lis la doc depuis un petit moment pour essayer de comprendre comment l'ORM de Django determine quels sont les champs d'un domaine, et savoir si mon probleme a une solution ou pas mais pour l'instant je n'ai encore rien trouve d'interessant.

Des idees?

demandé 19-Oct par sirocco (114 points)

2 Réponses

+1 vote

Ca n'est pas possible, les champs du modèle (qui sont des descripteurs) sont lus directement à la déclaration de la classe, c'est le comportement induit par la métaclasse ModelBase sur models.Model.

Si tu veux changer ce comportement par défaut, c'est toujours possible (c'est du Python), mais il va falloir te plonger dans le coeur de Django et créer ta propre implémentation du modèle.

répondu 20-Oct par debnet (990 points)
0 votes

En fait j'ai trouver une solution a mon probleme: http://blog.jupo.org/2011/11/10/django-model-field-injection/

La classe Field de Django contient une methode: contribute_to_class(Model, attr_name) qui permet de faire l'equivalent d'un setattr et rajoute la machinerie qui va bien derriere pour ajouter le champ au model.

Apparement l'usage n'est pas recommander et ca peut avoir des consequences: https://code.djangoproject.com/ticket/22555

Mais faute de mieux ca fait le job pour moi.

répondu 20-Oct par sirocco (114 points)

N'hésite pas à valider ta réponse pur qu'on sache qu'elle a obtenu une solution

...