장고: 왜 일부 모델 필드는 서로 충돌합니까?
Users에 대한 2개의 링크가 포함된 개체를 만들고 싶습니다.예:
class GameClaim(models.Model):
target = models.ForeignKey(User)
claimer = models.ForeignKey(User)
isAccepted = models.BooleanField()
그러나 서버를 실행할 때 다음 오류가 발생합니다.
-
'target' 필드의 접근자가 관련 필드 'User.gameclaim_set'과 충돌합니다.related_name 인수를 'target'의 정의에 추가합니다.
-
'claimer' 필드의 접근자가 'User.gameclaim_set' 관련 필드와 충돌합니다.'claimer'의 정의에 related_name 인수를 추가합니다.
오류가 발생하는 이유와 해결 방법을 설명해 주시겠습니까?
사용자에 대한 외부 키가 두 개 있습니다.Django는 사용자로부터 GameClaim으로 자동으로 역방향 관계를 생성하며, 이는 일반적으로gameclaim_set
그러나 FK가 두 개이기 때문에 두 개의 FK입니다.gameclaim_set
분명히 불가능한 속성입니다.그래서 당신은 장고에게 역관계를 위해 어떤 이름을 사용해야 하는지 알려줘야 합니다.
사용related_name
예를 들어 FK 정의의 속성입니다.
class GameClaim(models.Model):
target = models.ForeignKey(User, related_name='gameclaim_targets')
claimer = models.ForeignKey(User, related_name='gameclaim_users')
isAccepted = models.BooleanField()
그User
모델이 동일한 이름을 가진 두 개의 필드를 생성하려고 합니다. 하나는GameClaims
그것을 가지고 있는User
처럼target
그리고 또 다른 것은GameClaims
그것을 가지고 있는User
처럼claimer
이것은 Django의 방법으로 자동 생성된 속성이 충돌하지 않도록 속성의 이름을 설정할 수 있습니다.
OP가 추상 기본 클래스를 사용하지 않습니다...그러나 이 경우 FK에서 related_name을(를) 하드 코딩하면(예: ..., related_name="myname") 기본 클래스에서 상속된 각 클래스에 대해 하나씩) 이러한 충돌 오류가 발생합니다.아래에 제공된 링크에는 해결 방법이 포함되어 있으며, 이는 간단하지만 명확하지는 않습니다.
장고 문서에서...
ForeignKey 또는 ManyToManyField에서 related_name 특성을 사용하는 경우 항상 필드에 고유한 역명을 지정해야 합니다.이 클래스의 필드는 각 자식 클래스에 포함되며 매번 동일한 속성 값(related_name 포함)을 사용하기 때문에 추상 기본 클래스에 문제가 발생합니다.
자세한 내용은 여기.
때때로 추가 형식을 사용해야 합니다.related_name
사실, 상속이 사용될 때는 언제든지 가능합니다.
class Value(models.Model):
value = models.DecimalField(decimal_places=2, max_digits=5)
animal = models.ForeignKey(
Animal, related_name="%(app_label)s_%(class)s_related")
class Meta:
abstract = True
class Height(Value):
pass
class Weigth(Value):
pass
class Length(Value):
pass
여기서 충돌은 없지만 related_name은 한 번 정의되고 Django는 고유한 관계 이름을 만드는 것을 처리합니다.
그러면 Value 클래스의 하위 클래스에서 다음을 액세스할 수 있습니다.
herdboard_height_related
herdboard_lenght_related
herdboard_weight_related
예를 들어 다음과 같은 구조를 고려할 때, 저는 아장고 프로젝트에 서브모듈을 애플리케이션으로 추가할 때 가끔 이와 마주치는 것 같습니다.
myapp/
myapp/module/
myapp/module/models.py
다음을 INSTALLED_APPs에 추가할 경우:
'myapp',
'myapp.module',
django는 myapp.mymodule models.py 파일을 두 번 처리하는 것으로 보이며 위의 오류를 발생시킵니다.이 문제는 INSTALLED_APPS 목록에 기본 모듈을 포함하지 않음으로써 해결할 수 있습니다.
'myapp.module',
를포여하를 myapp
에 myapp.module
모든 데이터베이스 테이블이 잘못된 이름으로 작성되므로 이렇게 하는 것이 올바른 방법인 것 같습니다.
저는 이 문제에 대한 해결책을 찾던 중 이 게시물을 우연히 발견하여 이 글을 여기에 올렸습니다 :)
Jordan의 답변에 추가하는 것만으로도(Jordan 팁에 감사합니다), 당신이 앱 위의 레벨을 가져온 다음 앱을 가져오는 경우에도 발생할 수 있습니다. 예를 들어.
myproject/ apps/ foo_app/ bar_app/
따라서 앱, foo_app 및 bar_app을 가져오는 경우 이 문제가 발생할 수 있습니다.앱, foo_app 및 bar_app이 모두 설정에 나열되어 있었습니다.INSTALLED_APPs
그리고 앱을 가져오는 것을 피하고 싶을 것입니다. 그러면 동일한 앱이 두 개의 다른 네임스페이스에 설치되기 때문입니다.
apps.foo_app
그리고.foo_app
언급URL : https://stackoverflow.com/questions/1142378/django-why-do-some-model-fields-clash-with-each-other
'programing' 카테고리의 다른 글
클라이언트와 서버에 공통 알고리즘(ASP.NET C# VB Visual Basic IIS TLS 1.0 / 1.1 / 1.2)이 없기 때문에 통신할 수 없습니다. (0) | 2023.07.01 |
---|---|
불안정한 연결에서 대규모 프로젝트에 대한 깃 클론을 완료하는 방법은 무엇입니까? (0) | 2023.07.01 |
스프링 부트 사용 중 스프링 배치 범위 문제 (0) | 2023.06.26 |
SQL(Oracle)을 사용하여 문자열의 크기를 계산하는 방법은 무엇입니까? (0) | 2023.06.26 |
문자열에서 고유 식별자로 변환할 때 변환 실패 - 두 개의 GUID (0) | 2023.06.26 |