2012-01-27 6 views
0

ModelAdminのsave_modelメソッドをオーバーライドしているため、モデルにいくつかの追加フィールドを設定できます。しかし、私はDoesNotExist例外を取得し続けます。私はデバッガでコードを踏んでいて、ちょっと混乱しています。ModelAdmin.save_modelに渡されたオブジェクトがモデルと一致しないのはなぜですか?

モデルは、このフィールドを持っている:save_model方法で

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

私はobjパラメータの属性を見ると、私はこの参照:「created_by_idは」から来たの

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'は存在しないのですか?

答えて

0

db_column='created_by'を使用した理由はありますか?あなたは従来のデータベースを扱っていますか?通常、Djangoはdbカラムの名前を扱えるようにします。デフォルトでは、Djangoは_idをフィールド名に追加してdbカラム名を作成します。これはDjango Foreign Keyのドキュメントで説明されています。お使いのモデルのインスタンスで

あなたがアクセスすることができます:あなたはまだそれにユーザを割り当てていないので、あなたは、あなたの方法でobj.created_byにアクセスすることはできません

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

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

+0

値が割り当てられるまで、 'obj.created_by'にアクセスすることはできません。あなたの 'save_model'メソッドがどのように見えるかを提案して私の答えを更新しました。 'db_column'を使わないことをお勧めしますが、望むならここで使うことができます。 – Alasdair

+1

ああ、それは意味があります - 私はそれが割り当てられる前に既に割り当てられていたかどうかを確認したいと思っていました。私は自分のコードを変更して 'created_by_id'をチェックし、もしなければ' created_by'を割り当てます。あなたの助けをありがとう – Pikaling

関連する問題