2014-09-28 48 views
3

我正在遷移到Django 1.7。我有一些信號通過一個未保存的模型實例,現在拋出TypeError: Model instances without primary key value are unhashableDjango 1.7:傳遞未保存的實例會拋出「不可干擾」異常

我想知道Django pre_save信號如何通過實例呢?我正在瀏覽文檔,甚至發現在1.7(https://github.com/django/django/commit/6af05e7a0f0e4604d6a67899acaa99d73ec0dfaa)中實現了這個提交,我不知道它是如何工作的。

有人可以向我解釋pre_save如何解決這個問題,或者我可以如何繞過這個限制嗎?謝謝。

實施例以下代碼:

from django.dispatch import Signal 

send_text = Signal() 
unsaved_model = SomeModel() # note that neither `create` or `.save()` are being called 
send_text.send(sender=unsaved_model) # error gets thrown when this gets called 

回溯:

File "/home/ubuntu/fangsterr-app/notifications/models.py", line 43, in send 
    send_text.send(sender=self) 
    File "/home/ubuntu/virtualenvs/venv-2.7.5/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 194, in send 
    if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS: 
    File "/home/ubuntu/virtualenvs/venv-2.7.5/lib/python2.7/site-packages/django/db/models/base.py", line 484, in __hash__ 
    raise TypeError("Model instances without primary key value are unhashable") 
TypeError: Model instances without primary key value are unhashable 
+1

我不知道的是參數的信號是哈希的任何要求。你能顯示產生錯誤的實際代碼以及完整的回溯嗎? – 2014-09-28 05:08:46

+0

剛剛添加了一個示例 – fangsterr 2014-09-28 06:35:46

+0

請提供完整的回溯。 – 2014-09-28 06:48:51

回答

6

它看起來像的Django在於其信號調度過程中用於查找的高速緩存存儲所述sender。這要求sender是可散列的,這對於沒有pk的模型實例不起作用。

這個原因不影響pre_save et al。按照慣例,sender類別,而不是實例instance通過它自己的參數傳遞。請參閱the documentation

該解決方案很容易使用該類作爲sender,並將該實例作爲參數傳遞。

(如果這個工作,這只是偶然事件之前。這是固定的bug造成的所有未保存的模型實例,以評估爲相等。)

+0

耶再次看到回溯後,我得出了同樣的結論。感謝張貼 – fangsterr 2014-09-29 16:25:17