2013-03-13 78 views
0

我遇到了这个问题,并希望寻求您的帮助。使用Django查询过滤项目

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

我想要的是获得前10名“最年轻”的球,并且最多有3个蓝色球(这意味着如果在10个最小的球列表中有3个以上的蓝色球,则替换“redudant”与年轻的红球最古老的蓝色球)

要获得前10名:

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

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

  1. 迭代通过^ h sel_balls和计数蓝色球的(B =)
  2. 若B < = 3的号码:什么也不做
  3. 否则:获得追加B - 3颗红球,以取代旧(B - 3)蓝色球(和这些红球肯定不会出现在已经取出的原始10个球中)。我想我可以通过获取红球列表中最早的年龄值做到这一点,不喜欢另一个查询:

    add_reds = Ball.objects.filter(年龄> = oldest_sel_age)[:乙 - 3]

我的问题是:

  1. 有没有办法,我能满足只有一个查询的约束什么办法?
  2. 如果我必须做2个查询,有没有比我上面提到的方法更快的方法?

谢谢大家。

+0

你有没有尝试在模型中的类方法的功能?你可以在那里做你的逻辑,你可以在你的视图中这样称呼它:'sel_balls = Ball.sort_balls' – catherine 2013-03-13 08:35:40

回答

0

您应该使用注释来做到这一点。 见documentation

.annotate().filter()给 'WHERE'

.filter().annotate()后给出了 '具有'(这是你所需要的)