在向后关注ForeignKey之后,如何根据子属性过滤查询集?

时间:2018-01-09 10:03:41

标签: python django django-models django-queryset django-orm

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

我试图根据score_1>的次数找出胜利者。所有子对象中得分为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)

我已按照此问题的答案(Select Children of an Object With ForeignKey in Django?)来获取Parent对象的子对象。但是,我似乎无法弄清楚如何根据子模型中的属性过滤返回的集合。

one_better = childs_of_me.filter(score_1__gt=score_2)

返回错误:全局变量score_2 unknown

我将如何做到这一点?

1 个答案:

答案 0 :(得分:2)

您要做的是在查询集中引用另一个字段作为值。您可以通过构建F-expression

来完成此操作
one_better = childs_of_me.filter(score_1__gt=F('score_2'))

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