Comment puis-je déterminer si l'instance de classe du modèle Django est sous-classe d'un autre modèle?
J'ai une classe appelée BankAccount
comme classe de base. J'ai aussi CheckingAccount
et SavingsAccount
des classes qui héritent de BankAccount
.
Compte bancaire n'est pas une classe abstraite, mais je n'ai pas de créer un objet à partir d'elle, seulement l'héritage de classes.
Puis, j'exécute une requête comme ceci:
account = BankAccount.objects.get(id=10)
Comment puis-je savoir si le compte est CheckingAccount
ou SavingsAccount
?
La façon dont je fais ça maintenant, c'est de cette façon:
checking_account = CheckingAccount.objects.get(id=account.id)
Si ça existe, c'est un CheckingAccount
sinon, c'est un SavingsAccount
.
source d'informationauteur dannyroa
Vous devez vous connecter pour publier un commentaire.
Essayez d'utiliser la
checkingaccount
etsavingsaccount
attributs. Celle qu'il ne va pas exploser.Vous pouvez utiliser
isinstance(account, SavingsAccount)
mais est généralement préféré pour l'éviter et l'utilisation le canard de l'inférence de type en regardant les attributs de l'objet, et de voir si il charlatans comme une sous-classe.Pour voir si un l'objet possède un attributvous utilisez la bien nommée
hasattr
built-in la fonction ou de l'utilisationgetattr
et de vérifier pour la levée d'un AttributeError exception.Ajouter un GetAccountType() méthode de Vérification et de comptes d'Épargne, lorsque vous obtenez l'objet de compte bancaire.objets.get (), puis appelez, si tout ce qui dérive de Comptebancaire a cette méthode, puis vous serez amende.
Après quelques recherche j'ai trouvé des solutions de semblable à ceci:
Django multi-héritage de table, comment savoir qui est l'enfant de la classe d'un modèle?
Fondamentalement, il n'y a pas de solution élégante pour cette. Vous devez faire un tas de essayez-à l'exception des déclarations et de la force de django pour utiliser la classe que vous souhaitez.
Un peu janky, mais cela fonctionnerait: