Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型:从变量抽象基类继承_Python_Django_Inheritance_Django Models_Model - Fatal编程技术网

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

Python Django模型:从变量抽象基类继承,python,django,inheritance,django-models,model,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.I

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

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
交易可以从订单或费用中继承,因为它们都可以是交易的来源。
可以实现通用外键,以允许订单模型和费用模型中的可变外键引用,但我想知道是否有一种方法可以在不使用通用外键的情况下实现这一点。是否存在允许子类与变量抽象父类关联的特定安排、mixin、decorator、属性或方法?

这是不可能的。但是你想要的东西可以通过从
交易
费用
订单
建立
外键
不,你不能这样做。Django模型在运行时不能这样修改(在Django初始化之后)。无论如何,这不是一个好的设计模式。你混淆了组合和继承。
交易
不是一种
费用
或一种
订单
的类型,因此这样子类是没有意义的

只需使用两个单独的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)