2012-01-27 55 views
0

我重寫了我的ModelAdmin的save_model方法,以便可以在模型上設置一些其他字段。但是,我不斷收到DoesNotExist異常。我用調試器遍歷代碼,我有點困惑。爲什麼傳遞給ModelAdmin.save_model的對象與模型不匹配?

該模型具有這一領域:

created_by = models.ForeignKey(User, db_column='created_by', related_name='%(class)s_creator') 

在save_model方法時,我看obj參數的屬性,我看到:

Name: 
created_by 

Value: 
str: Traceback (most recent call last): 
    File "/home/vicki/.eclipse/org.eclipse.platform_3.7.0_155965261/plugins/org.python.pydev.debug_2.3.0.2011121518/pysrc/pydevd_resolver.py", line 182, in _getPyDictionary 
    attr = getattr(var, n) 
    File "/usr/lib/pymodules/python2.7/django/db/models/fields/related.py", line 301, in __get__ 
    raise self.field.rel.to.DoesNotExist 
DoesNotExist 

Name: 
created_by_id 

Value: 
NoneType: None 

在哪裏「created_by_id」來自,爲什麼'created_by'不存在?

回答

0

您爲什麼使用db_column='created_by'有什麼特別的理由?你在處理遺留數據庫嗎?通常,你會讓Django處理db列的名字。默認情況下,Django會將_id附加到字段名稱以創建數據庫列名稱。這在Django Foreign Key文檔中有解釋。

在你的模型實例,您可以訪問:

`obj.created_by_id` # the primary key of the related User instance 
`obj.created_by` # The `User` instance 

在你的方法,你不能訪問obj.created_by因爲你還沒有分配用戶呢。 created_by_id值爲None,並試圖獲取主密鑰NoneUser自然會引發DoesNotExist異常。

save_model方法應該是這個樣子:

class MyModelAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change): 
     obj.created_by = request.user 
     obj.save() 
+0

沒有特別的原因了'db_column ='created_by'',我只是喜歡那個。也許我應該讓Django來處理。問題中的信息是'save_model'方法開始時'obj'的樣子,在我做了任何事情之前。我想將模型的'created_by'字段賦值爲'request.user'。 – Pikaling 2012-01-28 15:25:11

+0

在分配了值之前,您無法訪問'obj.created_by'。我已經更新了我的答案,並提出了你的'save_model'方法應該是什麼樣子的建議。我建議你不要使用'db_column',但如果你願意,你可以在這裏使用它。 – Alasdair 2012-01-28 19:58:11

+1

現在這是有道理的 - 我想在我分配它之前檢查它是否已經被分配。我改變了我的代碼,以便檢查'created_by_id',如果沒有,它會分配給'created_by'。感謝您的幫助 – Pikaling 2012-01-28 20:16:27

相關問題