0

ユーザーが自分の表示列を選択するアプリケーションがあります。各表示列には、指定された式があります。その式を計算するには、いくつかの関連する列(1対1の関係)を結合して値を計算する必要があります。

モデルは次のようなものです(これは単なるサンプルモデルであり、実際には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

したがって、できれば「extra」コマンドを使用して関連する列を使用する方法について、少し手がかりを教えてください。ありがとう。

4

3 に答える 3

2

今では、Djangoのドキュメントには、最後の手段として追加を使用する必要があると記載されています。

したがって、extra()を使用しないクエリは次のとおりです。

from django.db.models import F

CompanyCode.objects.annotate(
    growth=F('quarter__sales_now') / F('quarter__sales_previous'),
)
于 2016-07-08T10:44:48.963 に答える
1

計算は単一Quarterのインスタンスで行われるため、どこで計算する必要がありSELECTますか?モデルratioにメソッド/プロパティを定義するだけです。Quarter

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

必要に応じてそれを呼び出します

于 2012-04-04T06:36:23.447 に答える
0

わかりました、わかりました。上記の使用:

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

問題を解決しました。

基本的に、「extra」を介して関連するモデルデータにアクセスするには、そのモデルがクエリに結合されていることを確認する必要があります。select_relatedを使用すると、クエリは前述のモデルを自動的に結合します。

ありがとう :)。

于 2012-04-04T10:39:51.613 に答える