2017-09-25 3 views
1

Je souhaite hériter d'une classe enfant à partir d'une classe de base abstraite variable. Ainsi, une classe enfant n'aurait pas à hériter d'une classe de base prédéfinie et serait à la place capable d'hériter de n'importe quelle classe de plusieurs classes de base. Idéalement, les modèles seraient configuration comme ceci:Modèles Django: Hériter de la classe de base abstraite variable

class Orders(models.Model): 
    order_number = models.IntegerField() 
    # Orders metrics 
    class Meta: 
     abstract = True 


class Fees(models.Model): 
    fee_number = models.IntegerField() 
    # Fee metrics 
    class Meta: 
     abstract = True 


class Transactions(Inherit from either Orders or Fees): 
    transaction_number = models.IntegerField() 
    # Transaction metrics 

Transactions seraient en mesure d'hériter de commandes soit ou frais qu'ils pourraient tous deux être une source d'une transaction. Des clés étrangères génériques pourraient être implémentées pour permettre la référence de clé étrangère variable dans le modèle Commandes et le modèle des frais, mais je suis curieux de savoir s'il existe un moyen de le faire sans utiliser de clés étrangères génériques. Existe-t-il un arrangement, un mixin, un décorateur, une propriété ou une méthode spécifique permettant d'associer une classe enfant à une classe parent abstraite variable?

Répondre

0

Non, vous ne pouvez pas faire cela. Les modèles Django ne peuvent pas être modifiés comme ça pendant l'exécution (après l'initialisation de django). Quoi qu'il en soit, ce n'est pas un bon motif de conception. Vous confondez la composition et l'héritage. Un Transaction n'est pas un type de Fee ou un type de Order donc cela n'a aucun sens de sous-classer comme ceci.

Vous pouvez résoudre votre problème sans une clé étrangère générique en utilisant simplement deux champs ForeignKey séparés:

class Transactions(models.Model): 
    transaction_number = models.IntegerField() 
    order = models.ForeignKey(Orders, null=True, blank=True) 
    fee = models.ForeignKey(Fees, null=True, blank=True) 

Vous pouvez ensuite interroger les différents types de transaction comme celle-ci:

fee_payments = Transactions.objects.exclude(fee=None) 
order_payments = Transaction.objects.exclude(order=None) 
1

Ceci est impossible. Mais ce que vous voulez peut être facilement réalisé en créant ForeignKey realtionships de Transaction à la fois Fees et Order.