2012-02-09 2 views
0

다음과 같은 코드를 생각해 내에서 필드의 이름을 얻을 :장고 - 그 init 함수

class MyManyToManyField(models.ManyToManyField): 
    def __init__(self,*args,**kwargs): 
    field_name = ?!? 
    kwargs["related_name"] = "%(app_label)s.%(class)s." + field_name 
    super(MetadataManyToManyField,self).__init__(*args,**kwargs) 

class MyModelA(models.Model): 
    modelAField = MyManyToManyField("MyModelB") 

class MyModelB(models.Model): 
    pass 

내 오버로드 init 함수 내에서 필드의 이름을 액세스 할 나를 위해 어떤 방법이 있나요를? modelAField의 related_name이 "MyAppName.MyModelA.modelAField"가되기를 원합니다.

난 그냥 kwarg로 전달에 대해 생각했습니다

field_name = kwargs.pop("related_name",None) 
    if not field_name: 
    raise AttributeError("you have to supply a related name!") 

하지만 조금 더 좋은 뭔가를 바라고 있어요 :

modelAField = MyManyToManyField("MyModelB",related_name="modelAField") 

다음은 초기화에서 사용.

감사합니다.

답변

2

앞서 언급 한 바와 같이 사용 contribute_to_class

, 필드의 객체는이 클래스 내 변수에 할당하기 전에, 그 __init__ 함수를 호출하여 인스턴스화해야합니다.

그러나 모델이 생성되는 동안 Django는 contribute_to_class이라는 필드에서 메소드를 찾습니다. 가 존재하는 경우에는 다음과 같이 호출됩니다 :

new_field.object.contribute_to_class(ModelClass, field_name) 

당신이 당신의 사용자 정의 필드 클래스에서이 메소드를 오버라이드 (override)하는 경우, 당신은 필드가 모델에 추가되는 지점에서 요구되는 어떤 초기화 수행 할 수 있습니다.

+0

그건 대단한 것입니다. 그것을 사랑해! –

+0

이것은 훌륭해 보이지만, contrib_to_class가 _before_ __init __()이라면, 내가 설정 한 어떤 속성도 여전히 사용할 수 없습니까? self._fieldName = contrib_name_class에 전달 된 field_name 인수를 설정하려고했습니다. 하지만 self._fieldName에 __init __()에서 접근 할 때, 이는 지속적으로 contrib_to_class에 설정 한 것이 아니라 기본값을 제공합니다. – trubliphone

+0

거의 1 년 후,이 응용 프로그램을 다시 작성하고 동일한 문제가 발생했습니다.Ian이 정확하다는 것을 알았습니다. 다음과 같이 contrib_to_class의 "related_name"인수를 수정해야했습니다 :'self.rel.related_name = "some_string"+ name' – trubliphone

1

나는 이것이 가능하지 않다고 생각합니다. MyManyToManyField 객체는 변수에 할당되기 전에 인스턴스화되므로 너무 영리한 작업을 수행하기에는 너무 이르다.

필드와 상호 작용하는 모델에 대해 장고의 메타 클래스에 동일한 마법이있을 수 있습니다.이 상호 작용을 하이재킹하고 논리를 그릴 수 있습니다. 그러나 나는이 시점에서 추측하고있다.

+0

그래, 그게 내가 생각한거야. 나는 지금 일하는 해결책을 가지고있다. 그것은 단지 나를 괴롭 히고있다. b/c 그것은 매우 우아하지 않다. 감사. – trubliphone

1

kwarg로 전달하는 것이 그렇게 번거롭지는 않습니다.

저는 객체가 많은 참조 포인터를 가질 수 있기 때문에 파이썬이 인스턴스의 이름을 결정할 수 없다고 생각합니다.

x = YourClass() 
y = x 

은 'Y'YourClass 'X'또는 인스턴스의 이름인가? 또는 YourClass의 인스턴스입니까?

+0

나는 당신의 요점을 이해합니다. 하지만 액세스 할 수있는 DjangoForm 특정 특성이있을 수 있다고 생각했습니다. 결국 필드 이름이 양식 클래스에 무엇인지 알 수 있습니다. – trubliphone

관련 문제