在 django 中将两个字段相乘

Posted

技术标签:

【中文标题】在 django 中将两个字段相乘【英文标题】:Multiply two fields together in 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?

【问题讨论】:

请您更改接受的答案 【参考方案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'))

【讨论】:

以上是关于在 django 中将两个字段相乘的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中将模型与不同的应用程序相乘?

如何在 django 中将两列与 group by 相乘和求和

如何在 Access 2010 中将单个字段的所有记录相乘

在 C++ 中将两个矩阵相乘

如何在 MIPS 中将两个数字相乘,得到大于 32 位的乘积?

用 SSE 在 C++ 中将两个 32 位整数向量相乘的最快方法