1

我正在研究Django和Google應用引擎上的應用。在我的應用程序中,我有幾個帶有幾個ReferenceProperty字段的模型。問題是,如果任何ReferenceProperty字段被刪除,它會在所有其他已使用的模型中產生與ReferenceProperty相關的錯誤。我想要的是,當某個字段被刪除時,如果刪除了一個用戶,那麼所有具有User作爲ReferenceProperty的字段仍應該可以正常工作,而不會有任何錯誤消息將關聯的用戶顯示爲不可用或類似的東西。Django Google應用引擎參考問題

有人可以請建議如何做到這一點?

在此先感謝。

回答

0

兩個可能的解決方案:

  • 檢查參考仍然存在,那麼你訪問它之前:

    如果不是obj.reference:
    #引用的實體被刪除

  • 當刪除可能引用的模型對象,查詢可能引用它的所有模型,並將其引用屬性設置爲無。

+0

刪除可能引用的模型對象時,請查詢可能引用它的所有模型,並將其引用屬性設置爲無。我認爲這是實際發生的事情,當一個引用被刪除時,它會變成無? – 2010-09-28 04:00:18

+0

沒有這樣的事情會自動發生。所有參考將保持(並且無效)。 http://code.google.com/appengine/docs/python/datastore/entitiesandmodels.html#References – benwixen 2010-09-28 10:06:41

0

當我有同樣的問題前,我無法找到一個通用的解決方案。我發現的唯一方法是嘗試/除了每個參考屬性。如果您在這裏找到另一個答案。

+0

在我上一個項目中,我創建了一些pre_delete信號,一旦用戶被刪除,它將引用屬性設置爲默認用戶。但是由於大量的模型,這種方法似乎不是一個好方法。 – 2010-09-21 12:11:18

+0

順便說一句,你是如何設法避免在前端和管理面板上使用異常處理的問題?我會欣賞一些例子。 – 2010-09-23 05:43:02

+0

不幸的是,我沒有找到一種方法來處理從模板拋出的異常,只有那些來自python文件的異常。也許你可以使用自定義模板標籤來檢查引用是否存在,如果不是,但我不確定。 – 2010-09-23 07:09:40

1

你也可以只設置一個標誌,說deleted,對實體您要刪除,然後將其保留在數據存儲中。這是避免在首位的所有參照完整性問題的優勢,但它是在兩個主要的缺點的成本:

  1. 您的所有現有查詢需要改變,以應對與擁有deleted屬性集實體,可以將它們從結果集中省略,也可以通過特殊方式將它們封裝起來。
  2. 「已刪除」數據保留在數據存儲中;這可能會膨脹數據存儲區,也可能不是敏感信息的選項。

這並不能真正解決您的問題,但我想我會提到它的完整性。

+0

感謝您對Cameron的回覆,但在大量模型的開發階段,解決方案不可行。 – 2010-09-28 04:02:00