【问题标题】:"SELECT...AS..." with related model data in Django"SELECT...AS..." 与 Django 中的相关模型数据
【发布时间】:2012-04-04 06:14:13
【问题描述】:

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

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

所以请给我一些线索,让我了解如何使用相关列,最好使用“额外”命令。谢谢。

【问题讨论】:

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


    【解决方案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】:

    既然计算是在单个 Quarter 实例上完成的,那么在 SELECT 中哪里需要这样做?您可以在 Quarter 模型上定义 ratio 方法/属性:

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

    并在必要时调用它

    【讨论】:

    • 对不起,以上只是一个例子。有 100 多个不同的比率和 100 个不同的字段。
    【解决方案3】:

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

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

    解决了问题。

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

    谢谢:)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-14
      • 2013-12-10
      • 1970-01-01
      • 2021-04-15
      • 2012-06-22
      • 2015-08-01
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多