2016-11-13 2 views
4

, 당신은 모델을 생성하고 선택적으로Django 역방향 관계가 오버 헤드를 추가합니까? 장고에서

class Man: 
     ... 

class Dog: 
     ... 
     owner = models.ForeignKey(Man, on_delete=models.SET_NULL) 

당신은 다음 Man

owner = some_dog.owner 

all_dogs = some_man.dog_set.all() 

하면 모든 개를 각각의 소유자에 대한 각 Dog를 조회하거나 얻을 수있는 필드에 외부 키를 지정할 수 있습니다 the docs에 지정된 역방향 관계를 만들지 않으려면

class Man: 
     ... 

class Dog: 
     ... 
     owner = models.ForeignKey(Man, on_delete=models.SET_NULL, related_name='+') 

이제 더 이상 all_dogs = some_man.dog_set.all()에 액세스 할 수 없습니다.

그러나 역방향 관계의 추가 "빌드"가 오버 헤드를 추가합니까?
all_dogs = some_man.dog_set.all()을 사용한 적이없는 경우
Dogrelated_name='+'을 지정했는지 여부는 중요합니까? 잠재적으로 일이 느려질까요?

이 기능은 순수하게 응용 프로그램 측 장고에서 구현 되었습니까? related_name='+'도 데이터베이스 스키마 자체를 변경합니까?

답변

4

그러나 역방향 관계의 추가 "건물"이 오버 헤드를 추가합니까?

없음

난 그냥 지금까지 사용되지 않는 경우 all_dogs = some_man.dog_set.all() 내가 개에 '+'= related_name을 지정했는지 여부를 문제 것인가? 잠재적으로 일이 느려질까요?

아니요, 아니요.

이 기능은 응용 프로그램 측 Django에서 순전히 구현 되었습니까? 아니면 related_name = '+'도 데이터베이스 스키마 자체를 변경합니까?

이 코드는 Python descriptors으로 구현됩니다. ForeignKey의 경우는 ReverseManyToOneDescriptor입니다. 데이터베이스 스키마에 변경 사항이 없으며 관련 이름의 유무가 마이그레이션을 생성하지 않습니다.

관계를 사용하지 않으면 실제로 모델 클래스의 특성으로 설명자 개체가 표시되어야합니다. 이런 식으로 :

>>> Dog.owner 
<django.db.models.fields.related_descriptors.ForwardManyToOneDescriptor at 0x105db25d0> 
>>> Man.dog_set 
<django.db.models.fields.related_descriptors.ReverseManyToOneDescriptor at 0x105db27d0> 

이들은 장고의 ORM 마법을 만드는 대상입니다.

관련 문제