0

我有一个应用程序,用户可以在其中选择自己的显示列。每个显示列都有一个指定的公式。要计算该公式,我需要连接几个相关列(一对一关系)并计算值。

模型是这样的(这只是一个示例模型,实际有 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

所以请给我一点线索,让我知道如何最好使用“额外”命令来使用相关列。谢谢。

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)

解决了这个问题。

基本上,要通过“额外”访问任何相关的模型数据,我们只需要确保该模型已加入到我们的查询中。使用 select_related,查询会自动加入提到的模型。

谢谢 :)。

于 2012-04-04T10:39:51.613 回答