我遇到了这个问题,想寻求你的帮助。
背景:我有一袋球,每个球都有一个年龄(红色和蓝色)和颜色属性。
我想要的是获得前 10 个“最年轻”的球,并且最多有 3 个蓝球(这意味着如果 10 个最年轻的球列表中的蓝球超过 3 个,则将“redudant”最旧的蓝球替换为最年轻的红球)
要获得前 10 名:
sel_balls = Ball.objects.all().sort('age')[:10]
现在,为了也满足“最多3个蓝球”的条件,我需要进一步处理:
- 遍历 sel_balls 并计算蓝球的数量(= B)
- 如果 B <= 3:什么都不做
否则:获得额外的 B - 3 个红球来代替最旧的 (B - 3) 个蓝球(并且这些红球必须没有出现在已经取出的原始 10 个球中)。我想我可以通过获取红球列表中最旧的年龄值来做到这一点,并执行另一个查询,例如:
add_reds = Ball.objects.filter(age >= old_sel_age)[: B - 3]
我的问题是:
- 有什么方法可以让我只在一个查询中满足约束?
- 如果我必须进行 2 次查询,有没有比我上面提到的一种方法更快的方法?
谢谢大家。