0

我遇到了这个问题,想寻求你的帮助。

背景:我有一袋球,每个球都有一个年龄(红色和蓝色)和颜色属性。

我想要的是获得前 10 个“最年轻”的球,并且最多有 3 个蓝球(这意味着如果 10 个最年轻的球列表中的蓝球超过 3 个,则将“redudant”最旧的蓝球替换为最年轻的红球)

要获得前 10 名:

sel_balls = Ball.objects.all().sort('age')[:10]

现在,为了也满足“最多3个蓝球”的条件,我需要进一步处理:

  1. 遍历 sel_balls 并计算蓝球的数量(= B)
  2. 如果 B <= 3:什么都不做
  3. 否则:获得额外的 B - 3 个红球来代替最旧的 (B - 3) 个蓝球(并且这些红球必须没有出现在已经取出的原始 10 个球中)。我想我可以通过获取红球列表中最旧的年龄值来做到这一点,并执行另一个查询,例如:

    add_reds = Ball.objects.filter(age >= old_sel_age)[: B - 3]

我的问题是:

  1. 有什么方法可以让我只在一个查询中满足约束?
  2. 如果我必须进行 2 次查询,有没有比我上面提到的一种方法更快的方法?

谢谢大家。

4

2 回答 2

0

你应该使用注释来做到这一点。请参阅文档

.filter()之前.annotate()给出'WHERE'

.filter().annotate()给出'HAVING'之后(这就是你需要的)

于 2013-03-13T11:45:32.533 回答
0

使用 Q 对数据库进行复杂查询:https ://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

于 2013-03-13T10:15:47.650 回答