Django動態(tài)模型字段

這幾天準備寫個工作流系統(tǒng)枷餐,因為工作流中一些模板的字段都是不固定的坷衍,于是思考有沒有動態(tài)的模型字段寝优,剛好找到了某個大神寫的東西,覺得有用(還沒有實踐)枫耳,于是記錄一下乏矾。

原文地址: https://stackoverflow.com/questions/7933596/django-dynamic-model-fields
翻譯地址:http://stackoverflow.org.cn/front/ask/view?ask_id=17340
我正在開發(fā)一個多租戶應(yīng)用程序,其中一些用戶可以通過管理員定義自己的數(shù)據(jù)字段迁杨,以收集表單中的其他數(shù)據(jù)并報告數(shù)據(jù)钻心。 后一位使JSONField不是一個很好的選擇,所以我有以下解決方案:

class CustomDataField(models.Model):
    """
    Abstract specification for arbitrary data fields.
    Not used for holding data itself, but metadata about the fields.
    """
    site = models.ForeignKey(Site, default=settings.SITE_ID)
    name = models.CharField(max_length=64)

    class Meta:
        abstract = True

class CustomDataValue(models.Model):
    """
    Abstract specification for arbitrary data.
    """
    value = models.CharField(max_length=1024)

    class Meta:
        abstract = True

注意CustomDataField如何具有一個ForeignKey到站點 - 每個站點將有一組不同的自定義數(shù)據(jù)字段铅协,但使用相同的數(shù)據(jù)庫捷沸。 然后可以將各具體數(shù)據(jù)字段定義為:

class UserCustomDataField(CustomDataField):
    pass

class UserCustomDataValue(CustomDataValue):
    custom_field = models.ForeignKey(UserCustomDataField)
    user = models.ForeignKey(User, related_name='custom_data')

    class Meta:
        unique_together=(('user','custom_field'),)

這有以下用途

tom_field = UserCustomDataField.objects.create(name='zodiac', site=my_site) #probably created in the admin
user = User.objects.create(username='foo')
user_sign = UserCustomDataValue(custom_field=custom_field, user=user, data='Libra')
user.custom_data.add(user_sign) #actually, what does this even do?

但這感覺很笨重,特別是需要手動創(chuàng)建相關(guān)數(shù)據(jù)并將其與具體模型相關(guān)聯(lián)狐史。 有更好的方法嗎亿胸?

已被搶先棄用的選項:

  • 自定義SQL即時修改表。 部分原因是因為這不會擴大预皇,部分是因為它太多了。
  • 無數(shù)據(jù)解決方案婉刀,如NoSQL吟温。 我沒有反對他們,但他們還不是很好突颊。 最終這些數(shù)據(jù)是打字的鲁豪,并且存在使用第三方報告應(yīng)用程序的可能性潘悼。
  • JSONField,如上所列爬橡,因為它不會很好地與查詢治唤。

原文有四個采納答案,但我覺得只有一種更合適糙申,下面只記錄那一張答案宾添。

JSONField:

JSON / JSONB字段支持任何JSON的可編碼的數(shù)據(jù)類型,而不僅僅是鍵/值對柜裸,但也往往是更快(對于JSONB)比Hstore更緊湊缕陕。幾個包實現(xiàn)JSON / JSONB字段,包括django-pgfields疙挺,但從Django 1.9扛邑,JSONField是一個內(nèi)置的使用JSONB存儲。
JSONField類似于HStoreField铐然,并且可以使用大型字典執(zhí)行得更好蔬崩。它還支持除字符串以外的類型,例如整數(shù)搀暑,布爾和嵌套字典沥阳。

使用:

#app/models.py
from django.contrib.postgres.fields import JSONField
class Something(models.Model):
    name = models.CharField(max_length=32)
    data = JSONField(db_index=True)

在shell中創(chuàng)建:

>>> instance = Something.objects.create(
                 name='something',
                 data={'a': 1, 'b': 2, 'nested': {'c':3}}
           )

索引查詢幾乎與HStoreField相同,除了嵌套是可能的险掀。 復雜索引可能需要手動創(chuàng)建(或腳本遷移)沪袭。

>> Something.objects.filter(data__a=1)
>>> Something.objects.filter(data__nested__c=3)
>>> Something.objects.filter(data__has_key='a')

感覺這個方法簡單,可以試一下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末樟氢,一起剝皮案震驚了整個濱河市冈绊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埠啃,老刑警劉巖死宣,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碴开,居然都是意外死亡毅该,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門潦牛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眶掌,“玉大人,你說我怎么就攤上這事巴碗∑优溃” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵橡淆,是天一觀的道長召噩。 經(jīng)常有香客問我母赵,道長,這世上最難降的妖魔是什么具滴? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任凹嘲,我火速辦了婚禮,結(jié)果婚禮上构韵,老公的妹妹穿的比我還像新娘周蹭。我一直安慰自己,他們只是感情好贞绳,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布谷醉。 她就那樣靜靜地躺著,像睡著了一般冈闭。 火紅的嫁衣襯著肌膚如雪俱尼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天萎攒,我揣著相機與錄音遇八,去河邊找鬼。 笑死耍休,一個胖子當著我的面吹牛刃永,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播羊精,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼斯够,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了喧锦?” 一聲冷哼從身側(cè)響起读规,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燃少,沒想到半個月后束亏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡阵具,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年碍遍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阳液。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡怕敬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出帘皿,到底是詐尸還是另有隱情赖捌,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站越庇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏奉狈。R本人自食惡果不足惜卤唉,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仁期。 院中可真熱鬧桑驱,春花似錦、人聲如沸跛蛋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赊级。三九已至押框,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間理逊,已是汗流浹背橡伞。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留晋被,地道東北人兑徘。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像羡洛,于是被迫代替她去往敵國和親挂脑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容