在Django中按对象子项中的条件过滤

时间:2019-02-20 10:29:28

标签: python django

Django 1.11。我有一个模型Cat

class Cat(OrderedModel):
  age = models.IntegerField()

和模型Flea

class Flea(models.Model):
  dangerous = models.BooleanField()
  cat = models.ForeignKey(Cat)

猫可能有很多跳蚤。猫是订购的模型。给定此顺序的位置,我想得到下一只至少有一个非危险跳蚤的猫。我的第一次尝试:

def get_next_cat(self, current_pos):
  cat = Cat.objects.filter(order__gt=current_pos).first()
  fleas = Flea.objects.filter(cat=cat, dangerous=False)
  if fleas is None:
    return get_next_cat(current_pos + 1)
  return cat

这似乎很冗长,我希望能够在方法的第一条语句中执行此逻辑。即来获得第一只下一只猫,例如该猫的跳蚤中至少有一个具有false属性的dangerous。这可能吗?

1 个答案:

答案 0 :(得分:0)

有两种方法可以解决这个问题,但是由于您只需要排除具有至少一条危险跳蚤的猫,因此可以使用lookups that span relationships。例如:

Cat.objects.filter(flea__dangerous=True)

会给您至少有一只危险跳蚤的猫。

如果您使用的是Django 2.x,还可以使用filter on annotations为每只猫添加一些危险的跳蚤注释。但这可能会使您的情况复杂化。