[python] 장고에서 ‘related_name’은 무엇입니까?

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

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



답변

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

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


답변

기존 답변에 추가하려면 모델에 동일한 테이블을 가리키는 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의 경우 관련 이름의 사용법을 건너 뛸 수 없었습니다).


답변

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()입니다.


답변

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


답변

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


답변