在Django中使用相关模型数据“SELECT ... AS ...”

时间:2012-04-04 06:14:13

标签: django django-models django-views django-queryset

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

模型就像(这只是一个示例模型,实际上有超过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'命令优先使用相关列。感谢。

3 个答案:

答案 0 :(得分:1)

由于计算是在单个Quarter实例上完成的,因此需要在SELECT进行计算?您只需在ratio模型上定义Quarter方法/属性:

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

并在必要时调用

答案 1 :(得分:1)

到目前为止,Django文档说应该use extra as a last resort

所以这是一个没有extra()的查询:

from django.db.models import F

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

答案 2 :(得分:0)

好的,我发现了。在上面使用:

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

解决了这个问题。

基本上,要通过'extra'访问任何相关的模型数据,我们只需要确保在我们的查询中加入该模型。使用select_related,查询会自动加入上述模型。

谢谢:)。