2012-04-04 3 views
0

사용자가 자신의 표시 열을 선택하는 응용 프로그램이 있습니다. 각 표시 열에는 지정된 수식이 있습니다. 이 수식을 계산하려면 관련 열 (일대일 관계)에 거의 가입하지 않고 값을 계산해야합니다.Django에서 관련 모델 데이터가있는 "SELECT ... AS ..."

class CompanyCode(models.Model): 
    """Various Company Codes""" 

    nse_code = models.CharField(max_length=20) 
    bse_code = models.CharField(max_length=20) 
    isin_code = models.CharField(max_length=20)  

class Quarter(models.Model): 
    """Company Quarterly Result Figures""" 

    company_code = models.OneToOneField(CompanyCode) 
    sales_now = models.IntegerField() 
    sales_previous = models.IntegerField() 

내가하고 시도 : 나는 또한 원시 쿼리를 사용하여 시도

ratios = {'growth':'quarter__sales_now/quarter__sales_previous'} 
CompanyCode.objects.extra(select=ratios) 
# raises "Unknown column 'quarter__sales_now' in 'field list'" 

:

모델은 (이것은 단지 예를 들어 모델, 실제는 100 개 이상의 필드가 있습니다)처럼

query = ','.join(['round((%s),2) AS %s' % (formula, ratio_name) 
    for ratio_name, formula in ratios.iteritems()]) 
companies = CompanyCode.objects.raw(""" 
    SELECT `backend_companycode`.`id`, %s 
    FROM `backend_companycode` 
    INNER JOIN `backend_quarter` ON ( `backend_companycode`.`id` = `backend_companyquarter`.`company_code_id`) 
    """, [query]) 
#This just gives empty result 

그래서 '추가'명령을 사용하여 관련 열을 어떻게 사용할 수 있는지 조금만 알려주십시오. 감사.

답변

0

좋아, 내가 그것을 발견 어디 전화 : 당신은 단지 Quarter 모델에 ratio 방법/속성을 정의 할 수 있습니다. 위의 사용 중 :

CompanyCode.objects.select_related('quarter').extra(select=ratios) 

이 문제를 해결했습니다.

기본적으로 '추가'를 통해 관련 모델 데이터에 액세스하려면 해당 모델이 Google 검색어에 가입되어 있는지 확인하면됩니다. select_related를 사용하면 쿼리가 위에서 언급 한 모델을 자동으로 조인합니다.

감사합니다. :).

1

Quarter 인스턴스에서 계산이 수행 중이므로 SELECT에서 필요합니까?

@property 
def quarter(self): 
    return self.sales_now/self.sales_previous 

을 필요

+0

죄송하지만, 위의 단지 예입니다. 100 가지 이상의 다양한 비율과 100 가지 필드가 있습니다. – Pratyush

1

이제 Django 설명서에는 use extra as a last resort이 있어야한다고 나와 있습니다. 그래서 여기

여분의()없이 쿼리입니다 :

from django.db.models import F 

CompanyCode.objects.annotate(
    growth=F('quarter__sales_now')/F('quarter__sales_previous'), 
) 
+0

django 1.7에서는이 기능이 작동하지 않을 수 있습니다. 자세한 내용은 https://code.djangoproject.com/ticket/14030을 참조하십시오. – yunshi

관련 문제