2013-05-21 4 views
1

테이블에서 데이터를 사용하거나 사용하지 않을 수도있는 동적으로 작성된 필터를 사용하여 여러 테이블에서 데이터를 검색해야합니다.여러 테이블에서 데이터를 검색하는 방법

def get_data(user_provided_criteria): 
     etr = ExportTrackingRecord.objects.filter(make_Q_object(user_provided_criteria)).select_related() 

     for data in etr: 
      s = data.solution 
      # do things with data from both tables 

지금까지 내가 솔루션에 필드에 필터링 할 일이면 내가 말할 수있는, 장고 : 내가해야 할 다른 곳에서 그런

class Solution(models.Model): 
    name = models.CharField(max_length=MAX, unique=True) 
    # Other data 

class ExportTrackingRecord(models.Model): 
    tracked_id = models.IntegerField() 
    solution = models.ForeignKey(Solution) 
    # Other data 

:

그래서 나는이 있다고 가정 해 조인을하고 select_related 두 개체를 모두 가져옵니다. 만약 내가 오직 ExportTrackingRecord의 필드를 필터하면 조인은 없을 것이고 django는 QuerySet에있는 각 ExportTrackingRecord에 대한 새로운 쿼리를 생성 할 것입니다. (수천 일 수 있습니다 ...)

저는 꽤 장고를 처음 접했지만 거기에 합리적인 방법으로 조인을 강제로?

답변

1

select_related()이 문제의 핵심입니다. 만약 당신이 그것을 사용하지 않고 관련 모델의 필드를 필터링하지 않는다면, Django는 조인을하지 않을 것이고 관련 모델의 데이터에 접근한다면 결과의 모든 행에 대해 추가 질의를 야기 할 것입니다.

ExportTrackingRecord.objects.filter(...).select_related('solution') 같은 것을하면 Django는 항상 Solution 테이블을 사용하여 결합을 수행해야합니다.

당신은 당신이 결과에로드되는 것을 대다 관계

0

select_related 컨트롤 같은 prefetch_related()을 필요로하는 역 외래 키 관계 선박을 통해, 다른 방향에서 동일한 작업을 수행해야하는 경우 때 검색어 세트 평가됩니다. 필터링에 관계없이 조인을 강제 실행합니다.

select_related을 지정하지 않으면 필터가 조인을 사용하는 sql 쿼리를 생성하더라도 상위 모델의 필드가 결과에로드되지 않고 액세스 할 때 추가 쿼리가 필요합니다.

관련 문제