2014-11-10 3 views
0

OneToOne 관계를 통해 객체를 검색하는 더 효율적인 방법은, 하나는 (django.contrib.auth.models에서) 사용자이고 다른 하나는 특권이다 : 나는 수 있어요장고 모델 : 나는 두 가지 모델을 사용하고

class Privilege(models.Model): 
    user = models.OneToOneField(User) 
    ... 

user = User.objects.get(username=request.user) 
if user: 
    privilege = Privilege.objects.get(user=user) 

내 질문 : 사용자의 privilege를 검색 할 수는 항상 privilege 객체를 얻기 위해 두 개의 데이터베이스 작업을 걸립니까? 하나만해도 돼?

답변

1

첫째, 당신은 단순히 관계를 통과 할 수 수동으로 두 번째 쿼리를 수행 할 필요가 없습니다 :

try: 
    privilege = User.objects.get(username=request.user).privilege 
except User.DoesNotExist # Use this with get() 
    pass 

을하지만 백그라운드에서 두 번째 쿼리를 할 것입니다.을 select_related

그래서, 당신은 반대 통과를보다 효율적으로 할 수 select_related을 사용할 수 있습니다 (예 : 1 개 쿼리) : 추가 관련 객체를 선택, 외래 키 관계를 "따라"하는 검색어 세트를 돌려줍니다 데이터를 가져옵니다. 이것은 하나의 복잡한 쿼리로 이어지는 성능 향상이지만 나중에 외래 키 관계를 사용하면 데이터베이스 쿼리가 필요하지 않음을 의미합니다.

privilege = User.objects.select_related("privilege").get(username=request.user).privilege 
+0

위대한! 고마워. –

관련 문제