私はなぜ明示的に署名引数を指定しても動作しませんが、盲目的に* argsをやっていることを理解しようとしている、** kwargs作品!私は本当に2つの違いがあまり見えませんか?動作しません署名の明示的な引数は機能しませんか?非常に奇妙な
例:
from django.db.models import CharField as _CharField
class CharField(_CharField):
def get_db_prep_value(self, value, connection, prepared=False):
if self.blank == self.null == self.unique == True and value == '':
value = None
return super(CharField, self).get_db_prep_value(value, connection, prepared) # <--- this does not work!
をし、私次のエラーを取得:これはうまく動作しますが
File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/__init__.py", line 276, in get_db_prep_save
return self.get_db_prep_value(value, connection=connection, prepared=False)
File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/subclassing.py", line 53, in inner
return func(*args, **kwargs)
File "/home/googledroid/Workspace/eclipse/gameproject/src/fields/__init__.py", line 13, in get_db_prep_value
return super(CharField, self).get_db_prep_value(value, connection, prepared)
File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/subclassing.py", line 53, in inner
return func(*args, **kwargs)
File "/home/googledroid/Workspace/eclipse/gameproject/virtualenv/lib/python2.6/site-packages/django/db/models/fields/subclassing.py", line 53, in inner
return func(*args, **kwargs)
TypeError: get_db_prep_value() got multiple values for keyword argument 'connection'
を:Djangoのソース、django.db.models.subclassing.call_with_connection_and_prepared.inner()
で
from django.db.models import CharField as _CharField
class CharField(_CharField):
def get_db_prep_value(self, value, *args, **kwargs):
if self.blank == self.null == self.unique == True and value == '':
value = None
return super(CharField, self).get_db_prep_value(value, *args, **kwargs)
、私はkwargsのいくつかの削除がありますが、完全にはわからないのはなぜですか?
これは意味があります。ありがとうございました!私が100%であることを確認するために、オリジナルのField.get_db_prep_value()メソッドを呼び出す前に、サブクラスでこれを行います。そのため、Field.get_db_prep_value()メソッドは影響を受けません(ただし、継承チェーンの最上位にあります)。 – GoogleDroid
事は、Django 1.3でです。Xでは、すべてのフィールドクラスはメタクラス「LegacyConnection」を使用します。このメタクラスは、 'db_type'、' get_db_prep_save'、 'get_db_prep_lookup'、' get_db_prep_value'のメソッドを、以下を行うラッパーで置き換えます:1)ラップされたメソッドが 'connection'を引数として受け入れることを確認し、2) '接続' ** kwarg **が提供されていることを確認してください。内部的には、ORM内のすべてのDjango機構がkwargsを使用しており、サブクラス化するときにもそれらを使用することが期待されます。 – koniiiik
私は完全にdjangoの内部についてはそれほど明確ではないし、おそらくそれの要点を持っているが、ありがとう! :D – GoogleDroid