첫째, 왜 3 번을 실행 init이있다? 한 번만 수입 된 models.py
비록
, 같은 내부 만든 Field
객체 ...
myfield = MyMixinCharField(max_length=512, new_arg="myarg")
는 ... 키워드 인수를 사용하여 필드 생성자를 호출 포함하는 여러 번 복제된다 그들은 원래로 창조되었다. 당신은
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
모듈을 사용할 수 있습니다 두 번째 둘의 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
그 키워드 인수를 지원하지 않기 때문에, 작동하지 않습니다, 그래서 당신은 얻을 것이다 내가 장고에 대한 필드 mixin 만들려면 어떻게합니까?
사용자 정의 필드 옵션을 추가하려면이 복제 행동, 당신은 장고 새 옵션을 직렬화 할 수 있도록 사용자 정의 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 같은 질문이 아닙니다. –