Django模型:从变量抽象基类继承

时间:2017-09-25 22:53:27

标签: python django inheritance django-models model

我希望从变量抽象基类继承到子类。因此,子类不必从预定义的基类继承,而是能够从多个基类的任何一个类继承。理想情况下,模型的设置如下:

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

交易可以从订单或费用继承,因为它们都可以是交易的来源。 可以实现通用外键以允许Orders模型和费用模型中的变量外键引用,但我很好奇是否有办法在不使用通用外键的情况下执行此操作。是否存在允许子类与变量抽象父类关联的特定排列,mixin,装饰器,属性或方法?

2 个答案:

答案 0 :(得分:1)

不可能。但是,您可以通过从ForeignKeyTransactionFees创建Order现实主义来轻松实现您想要的目标。

答案 1 :(得分:0)

不,你不能这样做。 Django模型在运行时(在django初始化之后)不能像这样进行修改。无论如何,这不是一个好的设计模式。你混淆了构图和继承。 Transaction不是Fee的类型或Order的类型,因此像这样子类是没有意义的。

只需使用两个单独的ForeignKey字段,即可在没有通用外键的情况下解决问题:

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

然后,您可以查询不同的交易类型,如下所示:

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