【问题标题】:Django models: Inherit from variable abstract base classDjango模型:从变量抽象基类继承
【发布时间】:2025-12-17 09:45:02
【问题描述】:

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

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 模型和 Fees 模型中引用可变外键,但我很好奇是否有办法在不使用通用外键的情况下做到这一点。是否有特定的安排、mixin、装饰器、属性或方法可以将子类与可变的抽象父类关联起来?

【问题讨论】:

    标签: python django inheritance django-models model


    【解决方案1】:

    不,你不能这样做。在运行时(在 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)
    

    【讨论】:

      【解决方案2】:

      这是不可能。但是,您可以通过创建从TransactionFeesOrderForeignKey realtionships 轻松实现您想要的。

      【讨论】: