2012-04-04 14 views
0

私はユーザーが自分の表示列を選択するアプリケーションを持っています。各表示列には、指定された数式があります。その数式を計算するには、関連する列(1対1の関係)にほとんど参加せずに値を計算する必要があります。以下のようDjangoで関連するモデルデータを持つ "SELECT ... AS ..."

モデルがある(これは単なる例のモデルであり、実際には100個の以上のフィールドを持つ):

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'" 

私も生のクエリを使用してみました:

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

[OK]を、私はそれを見つけたところそれを呼び出す:あなただけQuarterモデルにratioメソッド/プロパティを定義することができます。上の使用で:

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

問題を解決しました。

基本的に、関連するモデルデータに「余分」でアクセスするには、そのモデルがクエリに追加されていることを確認するだけです。 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

関連する問題