在向后跟踪外键后,如何根据子属性筛选查询集?



我是Python/Django的新手,所以非常感谢任何帮助!

我试图根据所有子对象中score_1> score_2的次数来找出获胜者。

我有两个模型:

class Parent(models.Model):
winner = models.IntegerField(default=0)
def foo(self):
childs_of_me = self.child_set.all()
number_childs = childs_of_me.count()
one_better = childs_of_me.filter(score_1__gt=score_2)
one_wins_count = one_better.count()
if one_wins_count > number_childs/2:
self.winner = 1
class Child(models.Model):
parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
score_1 = models.IntegerField(default=0)
score_2 = models.IntegerField(default=0)

我已经按照这个问题的答案(在 Django 中使用外键选择对象的子对象?)来获取父对象的子对象。但是,我似乎无法弄清楚如何根据子模型中的属性过滤返回的集。

one_better = childs_of_me.filter(score_1__gt=score_2)

返回错误:全局变量score_2未知

我将如何做到这一点?

您在这里要做的是将另一个字段作为查询集中的值引用。您可以通过构造一个F表达式来执行此操作:

one_better = childs_of_me.filter(score_1__gt=F('score_2'))

如果不这样做,Python 会将其解释为标识符。在这里,我们使用一个字符串,并将其包裹在F-object周围,以指示我们要引用一个字段。

最新更新