2010-07-06 81 views
1

我希望能爲包含不同類型的「文章」(出於參數的原因)的單個表建立模型。Django中的未知字段模型

每篇文章將有大部分常見字段(例如標題,日期等),但有些情況下某些文章類型(我的控制範圍之外)的字段要求和各自的驗證規則略有不同。沒有字段會保存特別大量的數據(最多〜100個字符)。

目前我正在考慮定義所有常見的字段,然後有任何不尋常的領域,在XML/JSON進行詳細的文本字段的模型:

class Article(models.Model): 
    owner = models.ForeignKey('User') 
    title = models.CharField(max_length=20) 
    published = models.BooleanField() 
    extra = model.TextField() # XML/JSON here for any unusual fields 
    created = models.DateField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True, auto_now_add=True) 
    # ... etc. 

我會創造Django的表單類處理驗證,因爲新的文章類型被添加,但我試圖避免爲不同的文章類型有不同的表格。

是否有一種普遍接受的方式來處理這樣的情況,還是主觀上很主觀?顯然,XML/JSON增加了一些不幸的開銷。

謝謝。

回答

0

難道你不能用GenericForeignKeys做到這一點?

http://www.djangoproject.com/documentation/models/generic_relations/

你想補充一個:

extra_type = models.ForeignKey(ExtraType) 
extra = generic.GenericForeignKey() 

到模型。似乎比包含json更好。

+0

即使'GenericForeignKey'需要指向另一個模型。 – 2010-07-06 09:00:05

+0

謝謝你的提醒,我會看看這個。 – 2010-07-06 09:33:20

1

這是一個非常可怕的方式來做到這一點。通常情況下,你會把這些數據放到一個單獨的表中並與之相關,但是......無論如何。

django-picklefield

+0

您可否詳細說明「將數據放入單獨的表格並與之相關」?我認爲我的主要問題在於,我不知道將哪些字段放在單獨的表格中 - 這將我帶回我開始的地方。那picklefield看起來很方便,但可能過度殺傷,因爲額外的未知領域將是例外而不是常態。將檢查出來。 – 2010-07-06 09:39:59

+1

@Sean而不是編輯帖子,你應該評論它,並說出爲什麼該行在答案中沒有用。 – aledalgrande 2014-06-04 18:20:38

0

我要做的就是創建一個從Article模型繼承的典範。
如果你想爲每個模型創建一個表,只需在你的元類中標記abstract = True
如果你想創建一個與基地Article一對一的關係,只需確保你的元類abstract = False
使用south將新模型遷移到數據庫並完成。

有關模型繼承的更多詳細信息,請參閱this articlethis document

是否有一個特殊的原因,你需要這種領域的靈活性?
他們可能從後臺改變?

+0

謝謝,抽象的父類看起來很有前途。我不應該把我的問題說成是「文章」,所以讓我試着清除它。我的應用程序要求用戶保存各種支付網關的憑證/設置。設置因網關而異 - 例如,某些網關具有額外的循環交易憑證)。我希望開發一個可以根據需要添加支付網關的系統 - 但仍然可以通過簡單查詢來查找用戶所有的網關(即無需手動對所有網關模型運行查詢,這是否有意義?建議? – 2010-07-06 21:33:57