2011-04-25 2 views
12

이번에는 내가 바보가 아니라 실제 충돌이라고 생각합니다.상속과 ForeignKey를 사용할 때 Django syncdb conflicting relevant_name

from django.db import models 

class Alpha(models.Model): 
    relation = models.ForeignKey('Delta', related_name = 'reverse_relation', blank = True, null = True) 

    class Meta: 
     abstract = True 

class Beta(Alpha): 
    pass 

class Gamma(Alpha): 
    pass 

class Delta(models.Model): 
    pass 

문제는 Delta.reverse_relation 베타의 인스턴스 또는 감마의 인스턴스를 참조 할 수 있다는 것입니다 : 나는 아래의 코드 (간체)가 있습니다. 나는 어떻게 든 여러 개의 related_name 값 (또는 하나의 클래스 이름에 따라 달라집니다)을 제공해야합니다. 문제가 명확하지만 완벽하게하려면 (syncdb를 실행할 때) 오류라고 생각합니다 : app.beta : Accessor for 'relation' 관련 필드 'Delta.reverse_relation'과 충돌합니다. related_name 인수를 'relation'에 대한 정의에 추가하십시오.
app.beta : 'relation'필드의 역 검색어 이름이 'Delta.reverse_relation'관련 필드와 충돌합니다. related_name 인수를 'relation'에 대한 정의에 추가하십시오.
app.gamma : 필드 'relation'에 대한 접근자가 관련 필드 'Delta.reverse_relation'과 충돌합니다. related_name 인수를 'relation'에 대한 정의에 추가하십시오.
app.gamma : 'relation'필드의 역방향 쿼리 이름이 'Delta.reverse_relation'관련 필드와 충돌합니다. related_name 인수를 'relation'에 대한 정의에 추가하십시오.

ForeignKey를 상위 알파에 배치 할 수 있습니까? 아니면이 코드를 베타와 감마로 잘라내어 붙여 넣을 수있는 유일한 방법입니까? 부모님이 모든 아이들이 공유하는 분야를 정의 할 수 없다면 유산 상속의 대상이 될 수 없으므로 그렇게하지 않는 것이 좋습니다.

도움이 많이 접수되었습니다.

(사람이 오류 메시지가 코드 상자에없는 이유에 대해 언급 할 수 있다면 나는 그것을 고칠 수 있습니다.)

+1

내 자신을 찾을 수 ... 행운의

relation = models.ForeignKey('Delta', related_name="%(app_label)s_%(class)s") 

최저 : https://docs.djangoproject.com/en/1.7/topics/db/models/#be-careful-with-related-name

는 본질적으로 관계 필드의 선언을 변경 Google을 통해 다시 질문하십시오. 내가 인정하고 싶은 것보다 더 많이 일어난다. – Mark

답변

21

을 당신이 도움이 관련 장고 설명서의 다음 조언을 찾을 수 있다고 생각 : 를

+0

답장을 보내 주셔서 감사합니다. 더 많은 사람들이이 솔루션을 찾을 수 있기를 바랍니다. – Mark

+0

앱 라벨이 동일한 외래 키가 두 개인 경우 어떻게해야합니까? 대답을 찾을 수 없습니다. –

+0

'related_name'은 키워드'app_label'과'class'를 가진 템플릿 화 된 문자열입니다. 필요한 경우, 첫 번째 foreign_key에 대한'related_name'을''% (app_label) s _ % (class) s_fk1_set "'으로 지정하고 두 번째''% (app_label) s _ % (class) s_fk2_set"'(또는 당신이 선택한 다른 문자열) – banerjs