【问题标题】:How to write a query with many ANDs and ORs with sum in Python?如何在 Python 中使用 sum 编写包含多个 AND 和 OR 的查询?
【发布时间】:2016-01-12 06:30:23
【问题描述】:

我正在尝试在 Django/Python 中编写以下查询: 在这个查询中,我没有一个简单的or,但我也有很多ands 和一个sum

SELECT sum(value) FROM myapp_category
WHERE (name='difficulty' AND key='hard')
   OR (name= 'success' AND key='yes')
   OR (name= 'alternative' AND key='yes')
   OR (name= 'processing' AND key='good')
   OR (name= 'personal_touch' AND key='yes') `

这是我的模型:

class Category(models.Model):
   name = models.CharField(max_length=50)
   key = models.CharField(max_length=30)
   value = models.FloatField(blank=True, default=0)

   def __str__(self):
      return self.name.encode('utf_8') + "_" + self.key.encode('utf_8')

而且我不想使用原始 sql,那么我可以使用什么?

更新答案: 感谢您的回答,这是完整的答案:

    sum = Category.objects.filter(Q(name='difficulty',key=evaluation.difficulty) | 
Q(name='nogos',key=evaluation.nogos) | 
Q(name='success',key=evaluation.success) | 
Q(name='alternative',key=evaluation.alternative) | 
Q(name='processing',key=evaluation.processing) | 
Q(name='personal_touch',key=evaluation.personal_touch))
.aggregate(result=Sum('value'))

    score = float(sum['result'])

【问题讨论】:

  • 你有型号吗?你能在你的问题中发布它们吗?
  • 我更新了我的问题 ;)
  • Django Filters - or?的可能重复
  • 在这个问题中,我没有一个简单的or,我也有很多ands。
  • @SafaaNa - 如 Geo Jacobs 的回答所示,您的答案与重复的答案差别不大。

标签: python mysql django django-queryset


【解决方案1】:

试试这个;

from django.db.models import Q, Sum


Category.objects.filter(Q(name='difficulty',key='hard') | Q(name='success',key='yes') | Q(name='alternative',key='yes') | Q(name='processing',key='good') | Q(name='personal_touch',key='yes')).aggregate(Sum('value'))

【讨论】:

  • 感谢您的回答,输出是一个数组而不是一个值。你确定从这个.annotate(Sum('value'))
  • 您要在什么基础上计算值的总和。你想如何分组?
  • 就像问题中的原始查询一样,我将所有条件都放在where 中,只需一个没有组的简单sum 就可以了。最后我想把这笔钱存到另一个表中
  • 我想我找到了,使用aggregate 而不是annotate
  • 我用完整的查询更新了这个问题,我用谷歌搜索了一下,找到了去做,非常感谢你的帮助
【解决方案2】:

UPD

from django.db.models import Q

results = Category.objects.filter(
    Q(name="difficulty", key="hard") | Q(name= "success", key="yes") | 
    Q(name="alternative", key="yes")|Q(name="processing" AND key="good") | 
    Q(name="personal_touch",key="yes"))

【讨论】:

  • 感谢您的回答,但它错过了sum 部分
【解决方案3】:

不是真正的解决方案,但可能会为其他想法提供意见:

SELECT sum(value) FROM myapp_category
WHERE name+"/"+key IN (
  'difficulty/hard',
  'success/yes',
  'alternative/yes',
  'processing/good',
  'personal_touch/yes'
)

问题:

  • 也不能使用参数提供列表
  • 查询速度较慢,因为无法使用索引

【讨论】:

  • 我将原始 sql 作为最后的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多