장고에서 'related_name'은 무엇입니까?


390

필드 와 필드 related_name에 유용한 인수 는 무엇입니까 ? 예를 들어 다음 코드에서 ? 의 효과는 무엇입니까?ManyToManyFieldForeignKeyrelated_name='maps'

class Map(db.Model):
    members = models.ManyToManyField(User, related_name='maps',
                                     verbose_name=_('members'))

12
@DanielRoseman 거꾸로 관계가 필요하지 않을 때 related_name = '+'를 사용하는 것이 성능이나 좋은 방법에 좋습니까?
lajarre

10
@lajarre의 질문에 대한 답변을 알고 싶습니다.
3cheesewheel

1
@ lajarre-나는 성능을 전혀 바꾸지 않을 것이라고 가정합니다. FeinCMS 콘텐츠 형식과 함께 한 번 사용해야했습니다. 나는 개인적으로 항상 그것을 지정하는 것이 좋은 습관이라고 생각합니다. related_name따라서 그것을 사용하지 않을 것이라는 것을 안다면 그것은 좋은 것 같아요. 그것은 물론 개인적인 견해입니다.
François Constant

@ 3cheesewheel 지금은 워드 프로세서에서의 : docs.djangoproject.com/en/2.0/ref/models/fields/...의 + 수단이 역의 관계를 만들지 마십시오
P. 마이어 NORE

답변:


529

related_name속성은 User모델 에서 모델로의 역관계 이름을 지정합니다 .

당신이를 지정하지 않으면 related_name, 장고는 자동으로 접미사 모델의 이름을 사용하여 하나를 생성 _set예를 들어, User.map_set.all().

당신이 경우 않는 , 예를 들어, 사용자가 지정한 related_name=mapsUser모델, User.map_set작업을 계속하지만, User.maps.구문은 분명 조금 청소기 덜 투박; 예를 들어, 사용자 객체 가있는 경우와 관련이있는 모델 의 모든 인스턴스를 가져 오는 데 current_user사용할 수 있습니다 .current_user.maps.all()Mapcurrent_user

장고 문서는 자세한 내용이 있습니다.


1
좋아, 나는 이것이 오래된 게시물이라는 것을 안다. 그러나 나는 이것을 이해하려고 노력하고 있습니다-관련 이름의 끝에 + 트릭은 무엇입니까? 예를 related_name='maps+'들어 위의 예에서 수행 한 경우 어떻게됩니까 ?
Sidd

10
당신은 +를 추가하는 경우, 장고 비활성화 매핑
josephmisiti

5
OneToOneField의 경우 기본 related_name은 소문자 클래스 이름입니다. 예를 들어 주어진 예에서 멤버가 OneToOnefield 인 경우 "User.map"이 작동합니다.
ancho

을 지정 related_name하면 _set계속 작동 합니까 django1.11 >??
Esir Kings

9
Django 2.1.3을 사용하며 독점적이라는 것을 알 수 있습니다. 일단 related_name지정 되면 _set더 이상 작동하지 않습니다.
stockersky

82

기존 답변에 추가하려면 모델에 동일한 테이블을 가리키는 2 개의 FK가있는 경우 관련 이름을 입력해야합니다. 예를 들어 BOM의 경우

@with_author 
class BOM(models.Model): 
    name = models.CharField(max_length=200,null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    tomaterial =  models.ForeignKey(Material, related_name = 'tomaterial')
    frommaterial =  models.ForeignKey(Material, related_name = 'frommaterial')
    creation_time = models.DateTimeField(auto_now_add=True, blank=True)
    quantity = models.DecimalField(max_digits=19, decimal_places=10)

따라서이 데이터에 액세스해야 할 때는 관련 이름 만 사용할 수 있습니다

 bom = material.tomaterial.all().order_by('-creation_time')

그렇지 않으면 작동하지 않습니다 (적어도 같은 테이블에 2 FK의 경우 관련 이름의 사용법을 건너 뛸 수 없었습니다).


2
둘 중 하나에 대해 related_name을 선택해야합니다. 다른 하나는 반드시 필요하지 않습니다.
Csaba Toth

32
related_name복수 여야합니다. ForeignKey 관계는 여러 개체를 반환하기 때문입니다.
Mesut Tasci

10

related_name더 복잡한 관련 클래스 이름이있는 경우 인수가 유용합니다. 예를 들어 외래 키 관계가있는 경우 :

class UserMapDataFrame(models.Model):
    user = models.ForeignKey(User) 

UserMapDataFramerelated에서 객체 에 액세스하기 위해 User기본 호출은 User.usermapdataframe_set.all()읽기가 매우 어렵습니다.

를 사용하면 related_name더 단순하거나 읽기 쉬운 이름을 지정하여 역 상관 관계를 얻을 수 있습니다. 이 경우을 지정 user = models.ForeignKey(User, related_name='map_data')하면 호출은 User.map_data.all()입니다.


3

관련 이름 매개 변수는 실제로 옵션입니다. 설정하지 않으면 Django가 자동으로 관계의 다른 쪽을 만듭니다. 지도 모델의 경우 Django는 map_set속성 을 생성 m.map_set하여 예제 를 통해 액세스 할 수 있습니다 (m은 클래스 인스턴스 임). Django가 사용하는 수식은 모델 이름과 문자열 _set입니다. 따라서 관련 이름 매개 변수는 새로운 동작을 제공하지 않고 Django의 기본값을 무시합니다.


0

prefetch_related다 대다 및 다 대일 관계 데이터의 프리 페치 데이터에 사용합니다. select_related단일 값 관계에서 데이터를 선택하는 것입니다. 두 모델 모두 모델에서 관계로부터 데이터를 가져 오는 데 사용됩니다. 예를 들어 다른 모델과 관계가있는 모델과 모델을 작성합니다. 요청이 오면 관계 데이터를 쿼리하고 Django에는 매우 좋은 메커니즘 book.author.name이 있습니다. 관계 데이터를 가져 오기 위해 모델 목록을 반복 할 때 관계 데이터를 액세스하려면 Django는 모든 단일 관계 데이터에 대해 각 요청을 작성합니다. 이 문제를 극복하기 위해 우리가해야합니까 prefetchd_relatedselected_related

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.