まず、なぜ3回を実行しているinitのですか?
models.py
は一度しか輸入されているが、このよう
myfield = MyMixinCharField(max_length=512, new_arg="myarg")
...として、その中に作成されたField
オブジェクトは、...キーワード引数を使用してフィールドコンストラクタを呼び出すことを伴う数回、クローン化されています彼らはもともとで作成されました。あなたは
File "django/db/migrations/state.py", line 393, in from_model
fields.append((name, field.clone()))
File "django/db/models/fields/__init__.py", line 464, in clone
return self.__class__(*args, **kwargs)
File "myproj/myapp/models.py", line 11, in __init__
traceback.print_stack()
がどこにある...それが起こっている場所を確認するために、出力に次の数回を示し
import traceback
class MyMixin(object):
def __init__(self, new_arg=None, *args, **kwargs):
super(MyMixin, self).__init__(*args, **kwargs)
print self.__class__, new_arg
traceback.print_stack()
を... ... traceback
モジュールを使用することができます2番目の2つのkwarg 'new_arg'?
あなたはもともと呼ば
...
myfield = MyMixinCharField(max_length=512, new_arg="myarg")
... "myarg"
からnew_arg
パラメータとして渡さ...
def __init__(self, new_arg=None, *args, **kwargs):
...しかし、あなたのでされているドンそのパラメータを基になるField
コンストラクタに渡します。
super(MyMixin, self).__init__(*args, **kwargs)
...基礎となるField
オブジェクトのどこにも格納されていないため、フィールドが複製されるとき、new_arg
パラメータはコンストラクタに渡されません。
しかし、スーパークラスのコンストラクタにそのオプションを渡すと...
どう
File "myproj/myapp/models.py", line 29, in MyMixinModelTest
myfield = MyMixinCharField(max_length=512, new_arg="myarg")
File "myproj/myapp/models.py", line 25, in __init__
super(MyMixinCharField, self).__init__(*args, **kwargs)
File "django/db/models/fields/__init__.py", line 1072, in __init__
super(CharField, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'new_arg'
を
CharField
は、そのキーワードの引数をサポートしていないため、動作しませんので、あなたが買ってあげます私はdjango用のフィールドmixinを作成するのですか?
カスタムフィールドオプションを追加したい場合は、このクローニング動作のため、あなたは、Djangoはあなたの新しいオプションをシリアル化できるように、カスタムdeconstruct()
メソッドを定義する必要があるので...
class MyMixin(object):
def __init__(self, new_arg=None, *args, **kwargs):
super(MyMixin, self).__init__(*args, **kwargs)
self.new_arg = new_arg
print self.__class__, new_arg
def deconstruct(self):
name, path, args, kwargs = super(MyMixin, self).deconstruct()
kwargs['new_arg'] = self.new_arg
return name, path, args, kwargs
class MyMixinCharField(MyMixin, models.CharField):
pass
class MyMixinModelTest(models.Model):
myfield = MyMixinCharField(max_length=512, new_arg="myarg")
...どの出力...
<class 'myapp.models.MyMixinCharField'> myarg
<class 'myapp.models.MyMixinCharField'> myarg
<class 'myapp.models.MyMixinCharField'> myarg
どのバージョンのdjangoを使用していますか? – Aya
私はバージョン1.9を使用しています – jmerkow
@solarissmokeそれは同じ質問ではありません。 –