說,有一個網頁有很多塊與它關聯。每個塊都需要自定義渲染,保存和數據。Django模型通用建模
最簡單的是,從代碼的角度來說,爲每個模型定義不同的類(因此,模型)。簡化如下:
class Page(models.Model):
name = models.CharField(max_length=64)
class Block(models.Model):
page = models.ForeignKey(Page)
class Meta():
abstract = True
class BlockType1(Block):
other_data = models.CharField(max_length=32)
def render(self):
"""Some "stuff" here """
pass
class BlockType2(Block):
other_data2 = models.CharField(max_length=32)
def render(self):
"""Some "other stuff" here """
pass
但隨後,
- 即使有這樣的代碼,我不能做這樣
page.block_set.all()
查詢來獲取所有不同的塊,不論塊類型的。 - 以上的原因是,每個模型定義了不同的表格;儘量使用鏈接模型和通用外鍵來實現它,可以解決問題,但它仍然會在每個頁面上留下多個數據庫表查詢。
什麼是建模它的正確方法?是否可以以某種方式使用泛型外鍵(或其他),將數據存儲在同一個數據庫表中,但實現了繼承範例。
更新:
我的觀點是,我如何仍然得到OOP範式工作。使用與相同的方法很多 ifs不是我想要做的。
在我看來,最好的解決方案是創建單獨的標準python類(最好在不同的blocks.py中),該類定義了一個保存,通過實例化相同的模型來保存數據及其「類型」。然後創建一個模板標籤和一個過濾器,根據模型的類型調用渲染,保存和其他方法。
指向正確的數據模型,謝謝。 在我的情況下,對於不同的塊類型,我需要查詢不同的外部數據源並呈現完全不同的html。此外,緩存數據(在塊級)因此,塊標籤並沒有真正的幫助。我想的只是單獨的簡單類(不是模型),它們有一個保存方法,寫入同一個數據庫表。 – 2009-12-21 15:48:22