programing

장고: 왜 일부 모델 필드는 서로 충돌합니까?

skycolor 2023. 6. 26. 21:13
반응형

장고: 왜 일부 모델 필드는 서로 충돌합니까?

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',

를포여하를 myappmyapp.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

반응형