簡體   English   中英

使用Django為抽象基類設置外鍵

[英]Setting up a foreign key to an abstract base class with Django

我已經將兩個類的公共屬性分解為一個抽象基類,但是我有另一個模型需要引用其中一個類。 不可能引用ABC,因為它實際上沒有數據庫表。

以下示例應說明我的問題:

class Answer(models.Model):
    ovramt = models.ForeignKey("Ovramt")
    question = models.ForeignKey("Question")
    answer = models.CharField(max_length=3, choices=(("yes","yes"),("no","no") ("NA","N/A"))
    likelihood = models.IntegerField(choices=LIKELY_CHOICES)
    consequence = models.IntegerField(choices=CONSEQUENCE_CHOICES)

    class Meta:
        abstract = True

class Answer_A(Answer):
    resident = models.ForeignKey("Resident")
    def __unicode__(self):
        return u"%s - %s - %s" %(self.ovramt.ssa.name, self.resident, self.question)    

class Answer_B(Answer):
    def __unicode__(self):
        return u"%s - %s" %(self.ovramt.ssa.name, self.question)    

class Answer_Risk(models.Model):
    answer = models.ForeignKey("Answer")
    risk = models.CharField(max_length=200)

    def __unicode__(self):
        return self.risk

Answer_A和Answer_B略有不同,Answer_A還需要與另一個表的FK關系。 Answer_B以后可能還需要一些特定的屬性。 如果我將Answer_B作為超類 - 並且具有Answer_A子類或組成它,那么問題仍然存在。

無論是Answer_A還是Answer_B,'風險'都是相同的。 我還有其他模型需要引用'答案'而不管它的子類型。 如何才能做到這一點? 無論它的子類型如何,您如何引用類型?

更新:
我試圖避免加入操作但我不認為我能夠。 是否值得在所有'答案'中引用'Resident'並在必要時將其歸零? 或者這被認為是非常糟糕的做法?

通用關系似乎是解決方案。 但它會使事情進一步復雜化。

在我看來; 您的模型結構已經比必要的更復雜。 我只想將所有三個Answer模型合並為一個。 這條路:

  • Answer_Risk無需修改即可使用。
  • 如果是Answer_A您可以將resident設置為None(NULL)。
  • 您可以返回不同的字符串represantations,具體取決於resident == None (換句話說;相同的功能)

還有一件事; 您的答案可能有多種風險嗎? 如果他們沒有或有一個風險,您應該考慮采用以下替代實施:

  • 使用一對一的關系
  • 將風險降級為Answer類中的字段(或任意數量的字段)。

我主要關注的不是數據庫結構和性能(盡管這些更改應該提高性能),而是代碼可維護性

我的直覺是建議刪除基類上的抽象修飾符。 你將得到相同的模型結構,但答案將是它自己的表。 這樣做的缺點是,如果這些是大型表和/或您的查詢很復雜,對它的查詢可能會明顯變慢。

或者,你可以保留你的模型為是,但更換ForeignKey的一個來回答GenericForeignKey 你在模型繼承的語法糖中失去了什么,你獲得了一點查詢速度。

我不相信可以通過ForeignKey(或任何功能相同的)引用抽象基礎模型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM