2010-02-07 5 views
7

첫째로, 나는 문제를 해결하는 방법을 알고 있습니다. 나는 그것이 왜 일어나는지 이해하려고 노력하고 있습니다. 오류 메시지 :Django 모델 : 이름 충돌 이유는 무엇입니까?

users.profile: Reverse query name for field 'address' clashes with related field 'Address.profile'. Add a related_name a rgument to the definition for 'address'.

그리고 코드 : 내가 올바르게,이 라인을 이해한다면

class Address(models.Model): 
    country = fields.CountryField(default='CA') 
    province = fields.CAProvinceField() 
    city = models.CharField(max_length=80) 
    postal_code = models.CharField(max_length=6) 
    street1 = models.CharField(max_length=80) 
    street2 = models.CharField(max_length=80, blank=True, null=True) 
    street3 = models.CharField(max_length=80, blank=True, null=True) 

class Profile(Address): 
    user = models.ForeignKey(User, unique=True, related_name='profile') 
    primary_phone = models.CharField(max_length=20) 
    address = models.ForeignKey(Address, unique=True) 

가 :

address = models.ForeignKey(Address, unique=True) 

이 속성을 일으킬 것인가는 함께 Address 클래스에 추가 할 이름은 profile입니다. 다른 "프로필"이름을 만드는 이유는 무엇입니까?


역 이름이 필요하지 않으면 어떻게합니까? 그것을 사용 중지하는 방법이 있습니까? 주소는 십여 가지에 사용되므로 역 관계의 대부분은 어쨌든 비어있게됩니다.

주소 필드를 별도의 테이블이 아닌 모델에 복사하는 방법이 있습니까? 파이썬 상속이 없다면 (이것은 이해가되지 않습니다. 모델에 2 개의 주소가 있으면 작동하지 않습니다).

답변

24

django docs에 말한다 :

것은 당신이 장고 '+'로 related_name을 설정 뒤로 관계를 만들지 않은 선호하세요.

user = models.ForeignKey(User, related_name='+') 

을하지만 난

+0

그걸 보지 못했습니다, 감사합니다! 이상한 구문. – mpen

+0

이것은 올바른 사용 중지 방법입니다. – Exelian

+0

은 https://code.djangoproject.com/ticket/5537에서 왔습니다. –

1

는 내가 잘못된 profile 필드가 될 것 찾아 길에서 ...하지만 하나 오는 곳 확실하지 않다 : 프로필, ./manage.py shell, from ... import Address에서 일시적으로 제거 address = models.ForeignKey(…) 다음 Address.profile가 당신을 말할 것이다 무엇을 참조하십시오.

내가 상속을 사용하지 않고 다른 모델 만의 필드를 상속하는 공식적인 방법이 생각 ...하지만하지 않습니다 당신이 할 수 가짜 같은 (SourceModel이고, 예를 들면, AddressTargetModel는, 예를 들어, Profile) :

for field in SourceModel._meta.fields: 
    TargetModel.add_to_class(field.name, copy.deepcopy(field)) 

+0

당신이 말을 했습니까 .... 그것을 자신을 해본 적이 예를 들어, 다음은 사용자 모델은이 모델에 이전 버전과의 관계를 얻을하지 않도록합니다. 'AttributeError : type object 'Address'속성에 'profile'이 없습니다. 사실 ... 이름을 지정하지 않고서는 더 이상 오류를주지 않습니다. 내가 무엇을 바꿨는지 잘 모르겠다.><아마도 약간 캐시 된 것일 수도있다. – mpen

0

나는 그것이 역 이름을 비활성화 할 수 생각하지 않습니다 (이 Django's ModelBase __new__ implementation에서오고있다).

코드를 통해 grep을 빨리 처리했으며 관련 모델에서 related_name 필드를 설정하지 않는 로직이없는 것처럼 보입니다.