2012-07-11 26 views
0

我製作了一個django應用程序,可以即時創建模型和數據庫表。據我所知,這是做我所需要的唯一可行的方式。問題在於如何在頁面之間傳遞動態創建的模型。Django - 如何在頁面之間傳遞動態模型

我可以想到一些這樣做的方法,但它們都聽起來很可怕。我能想到的方法是:

  1. 在views.py中使用全局變量。這似乎是一個可怕的黑客攻擊,並且如果有多個同時用戶,可能會導致衝突。
  2. 在URL中傳遞引用並使用一些eval hackery來嘗試並重新模型。這可能是愚蠢的,因爲模型可能在途中被垃圾收集。
  3. 使用佔位符應用程序。這似乎是一個壞主意,因爲多個用戶之間的衝突。
  4. 有一個不可見的窗體,當單擊鏈接時發佈模型。再次很hacky。

有沒有這樣做的好方法,如果不是,這些方法之一是否比其他方法更可行?

P.S.以防止我的應用程序從預先存在的數據庫接收數據(作爲json字符串),然後將其緩存到本地(即在Web服務器上),以便即時創建適當的模型和表。然後,這個想法就是呈現這些數據,並對其進行各種過濾和深入研究,而不會對主數據庫造成過度的壓力(因爲每個查詢從數億個數據點的數據庫中返回幾百個結果)W.R.T.在圖3中,表格基於查詢和時間戳的散列來命名,但是佔位符應用將具有預定的名稱。

感謝,

jhoyla

編輯補充:謝謝你們,我現在已經解決了這個問題。我最終使用了兩個答案來給出一個完整的答案。因爲我只能接受一個,我會接受一個內容類型,可惜我沒有聲望給予支持,但是如果/當我做這些時,我會盡力返回並適當地提出上調。

在它的整體解決方案,

from django.contrib.contenttypes.models import ContentType 
view_a(request): 
    model = create_model(...) 
    request.session['model'] = ContentType.objects.get_for_model(model) 
    ... 

view_b(request): 
    ctmodel = request.session.get('model', None) 
    if not ctmodel: 
     return Http404 
    model = ctmodel.model_class() 
    ... 
+0

而不是將數據複製到另一個數據庫,你有沒有考慮過使用類似的Memcache或另一個緩存層? – mipadi 2012-07-11 16:38:43

+0

你使用的應用名稱是什麼? – Hassek 2012-07-11 16:41:17

+0

我理論上可以使用Memcache或類似的東西,但獲得法律批准的新軟件是一場噩夢。更容易讓自己成爲一個人。 – jhoyla 2012-07-12 08:48:13

回答

2

我首先想到的是使用的內容類型,並通過通過URL類型/型號信息。

+0

這也是我的第一個想法。從來沒有創建過模型,是否會導致所有正常的事情發生,包括創建content-type-id? – 2012-07-12 02:15:41

+0

它似乎沒有顯示在內容類型中。據推測我可以添加它? – jhoyla 2012-07-12 08:27:21

+0

好的,我可以通過'django.contrib.contenttypes.models.ContentType.objects.get_for_model(model)'獲得我的模型的ContentType,其中模型是我動態創建的模型。我如何利用這個從另一個角度訪問模型? – jhoyla 2012-07-12 17:40:55

1

您也可以使用Django的sessions framework,

def view_a(request): 
    your_model = request.session.get('your_model', None) 

    if type(your_model) == YourModel 
     your_model.name = 'something_else' 

    request.session['your_model'] = your_model 

    ... 

def view_b(request): 
    your_model = request.session.get('your_model', None) 

    ... 

您可以store almost anything in the session dictionary和管理也容易:

del request.session['your_model'] 
+0

顯然,你不能泡飛機上的模塊。你得到: 異常類型:PicklingError 異常值:不能鹹菜<類的0f3ca88a74423fbbffe7b39805c5d794.0f3ca88a74423fbbffe7b39805c5d794'>:模塊0f3ca88a74423fbbffe7b39805c5d794的導入失敗 這是因爲沒有這樣的模塊。 如果我將醃菜支持添加到模型中作爲一個函數就足夠了? – jhoyla 2012-07-12 08:40:50

+0

經過一番研究和實驗,結果證明,至少根據python文檔,未定義在頂層的函數是不可取的。有什麼方法可以讓會話使用元帥,或其中的一些變種,而不是泡菜? – jhoyla 2012-07-12 10:55:49

+1

爲什麼不將模型的PK存儲在會話中,並從數據庫中檢索它? – mipadi 2012-07-12 15:18:09