L'écriture d'un __init__ de la fonction pour être utilisé dans django modèle
Je suis en train d'écrire un __init__
de la fonction pour l'un de mes modèles afin que je puisse créer un objet en faisant:
p = User('name','email')
Quand j'écris le modèle, j'ai:
def __init__(self, name, email, house_id, password):
models.Model.__init__(self)
self.name = name
self.email = email
Cela fonctionne et je peux enregistrer l'objet dans la base de données, mais quand je fais User.objects.all()
, il n'a pas tirer quoi que ce soit, sauf si je sors mon __init__
fonction. Des idées?
- Pourquoi faites-vous cela? Cette capacité fait partie d'un Django modèle sans vous écrire du code.
- Quand je l'ai essayer sans l'init, ils vont tous dans le mauvais champ pour une raison quelconque, à moins que je spécifier l'Utilisateur(nom='aoeu"), qui prend beaucoup d'espace supplémentaire.
- Quel est le problème avec explicite champ=valeur des affectations? Dans le long terme, vous aurez probablement à être plus heureux. Après tout, vous écrivez que très peu de ces types de lignes de code.
Vous devez vous connecter pour publier un commentaire.
En s'appuyant sur de Django reinhardt, des fonctionnalités intégrées et passage de paramètres nommés serait la solution la plus simple.
Mais si vous êtes fixé sur l'enregistrement de certaines touches, je te suggère l'ajout d'une statique de la commodité de la méthode de la classe au lieu de vous embêter avec l'initialiseur.
Django attend la signature d'un modèle du constructeur à être
(self, *args, **kwargs)
, ou certains fac-similé raisonnable. Votre modification de la signature à quelque chose de complètement incompatible a été cassé.You may be tempted to customize the model by overriding the __init__ method. If you do so, however, take care not to change the calling signature as any change may prevent the model instance from being saved.
à partir de: docs.djangoproject.com/en/2.1/ref/models/instancesLa réponse correcte est d'éviter primordial
__init__
et écrire un classmethod comme décrit dans la Django docs.Mais cela pourrait être fait comme vous essayez, il vous suffit d'ajouter dans
*args, **kwargs
pour être accepté par votre__init__
, et de les transmettre à la super appel de méthode.super(<YourModelName>, self).__init__(*args, **kwargs)
Ne pas créer des modèles avec des arguments paramètres. Si vous faites un modèle comme suit:
Il devient très illisible très rapidement que la plupart des modèles exiger plus que pour l'initialisation. Vous pourriez très facilement se retrouver avec:
Un autre problème, c'est que vous ne savez pas si 'Bert' est le premier ou le dernier nom. Les deux derniers chiffres pourrait facilement être un numéro de téléphone et un système d'id. Mais sans qu'il soit explicite vous sera plus facile de les confondre ou mélanger l'ordre si vous utilisez les identifiants. Quoi de plus est que le faire sur commande va mettre encore une autre contrainte sur d'autres développeurs qui utilisent cette méthode et ne se souviennent pas de l'ordre arbitraire de paramètres.
Vous préférez quelque chose comme ceci à la place:
Si c'est pour des tests ou quelque chose comme ça, vous pouvez utiliser une usine de créer rapidement des modèles. L'usine garçon lien peut être utile: http://factoryboy.readthedocs.org/en/latest/