2017-09-25 106 views
1

我希望從變量抽象基類繼承到子類。因此,子類不必從預定義的基類繼承,而是可以從任何一個類的多個基類繼承。理想的情況是,該機型將設置像這樣:Django模型:從變量抽象基類繼承

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模型和費用模型中的可變外鍵引用,但我很好奇是否有一種方法可以在不使用泛型外鍵的情況下執行此操作。是否有一個特定的安排,混搭,裝飾,屬性或方法,將允許一個孩子類與變量抽象父類的關聯?

回答

0

不,你不能這樣做。 Django模型在運行時不能像這樣修改(在django初始化之後)。無論如何,這不是一個好的設計模式。你混淆了構圖和繼承。 A 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) 
1

這是不可能。但是,通過創建ForeignKeyTransactionFeesOrder,您可以輕鬆實現您想要的結果。