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
。这可能吗?
答案 0 :(得分:0)
有两种方法可以解决这个问题,但是由于您只需要排除具有至少一条危险跳蚤的猫,因此可以使用lookups that span relationships。例如:
Cat.objects.filter(flea__dangerous=True)
会给您至少有一只危险跳蚤的猫。
如果您使用的是Django 2.x,还可以使用filter on annotations为每只猫添加一些危险的跳蚤注释。但这可能会使您的情况复杂化。