【问题标题】:Multiply two fields together in django在 django 中将两个字段相乘
【发布时间】:2014-11-09 12:45:48
【问题描述】:

我有以下疑问:

sales_for_date_for_provider.exclude(sales_or_return='R').values_list('royalty_price', 'conversion_to_usd'))

是否可以在查询中使用多个royalty_price * conversion_to_usd?还是我需要做一个列表理解或深入研究原始 SQL?

【问题讨论】:

  • 请您更改接受的答案

标签: python mysql django django-models django-orm


【解决方案1】:

您可以使用extra() 并指定select 参数:

sales_for_date_for_provider.extra(select={'result': 'royalty_price * conversion_to_usd'})

结果将包含一个QuerySet,其中每个对象都有一个属性result,其中包含royalty_priceconversion_to_usd 字段的乘积。

【讨论】:

  • 我如何获得这些结果的总和?以下查询不起作用,因为它无法识别列结果:sum(sales_for_date_for_provider.exclude(sales_or_return='R').values_list('result').extra(select={'result': 'royalty_price * conversion_to_usd'}))
  • @David542 尝试将values_list 放在extra 之后:sales_for_date_for_provider.exclude(sales_or_return='R').extra(select={'result': 'royalty_price * conversion_to_usd'}).values_list('resul‌​t')
  • 如果您将其传递给sum,您可能还需要flat=True
  • 以下是有效的方法:sum(sales_for_date_for_provider.exclude(sales_or_return='R').extra(select={'result': 'royalty_price * conversion_to_usd'}).values_list('result', flat=True))
  • Django 计划弃用此方法。请提供不同的、更可接受的解决方案。如果可以的话,我会的,但我试图找到相同的答案。
【解决方案2】:

Django 文档warns 我们认为extra() 方法将很快被弃用。由于我在搜索类似问题时遇到了这个答案,我想我会使用 Django 的built-in expressions,特别是F() 对象分享一种替代方法。

针对最初的问题,您可以通过以下方式实现预期的结果:

sales_for_date_for_provider.annotate(
    result=F('royalty_price') * F('conversion_to_usd'))

From the documentation:

F() 可用于通过将不同字段与算术组合来在模型上创建动态字段:

下面是从文档中提取的另一个示例,进一步说明了它的用法:

company = Company.objects.annotate(
    chairs_needed=F('num_employees') - F('num_chairs'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 2012-08-23
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多