我想明白爲什麼明確指定簽名參數不起作用,但只是盲目地做*參數,** kwargs作品!我真的沒有看到兩者之間有太大的區別?簽名中的顯式參數不起作用?很奇怪
示例不起作用:
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'
雖然這工作得很好:
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)
在Django源,django.db.models.subclassing.call_with_connection_and_prepared.inner()
,我看到有一些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的內部結構並不十分清楚,所以沒有100%清楚,並且很可能得到了它的要點,但謝謝! :D – GoogleDroid