我有一个应用程序,用户可以选择自己的显示列。每个显示列都有一个指定的公式。要计算该公式,我需要连接几个相关列(一对一关系)并计算值。
模型就像(这只是一个示例模型,实际上有超过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'命令优先使用相关列。感谢。
答案 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,查询会自动加入上述模型。
谢谢:)。