Django通过2个外键的计算值进行过滤
考虑以下几点:Django通过2个外键的计算值进行过滤,django,django-models,filter,foreign-keys,Django,Django Models,Filter,Foreign Keys,考虑以下几点: 级战斗机(型号.型号): ... #一串田地 类视图(models.Model): fighter=models.ForeignKey(fighter,on_delete=models.CASCADE,related_name=“views”) viewer=models.ForeignKey(User,on_delete=models.PROTECT,related_name=“viewsed”)#User.viewsed.all()返回所查看用户的所有视图对象 类冲突(mod
级战斗机(型号.型号):
...
#一串田地
类视图(models.Model):
fighter=models.ForeignKey(fighter,on_delete=models.CASCADE,related_name=“views”)
viewer=models.ForeignKey(User,on_delete=models.PROTECT,related_name=“viewsed”)#User.viewsed.all()返回所查看用户的所有视图对象
类冲突(models.Model):
win\u fighter=models.ForeignKey(fighter,on\u delete=models.SET\u NULL,related\u name=“wins”)
损失\u战斗机=型号。外键(战斗机,打开\u删除=型号。设置\u空,相关\u name=“损失”)
这里的关键是fighter\u quality=wins/views=fighter.wins.all().count()/fighter.views.all().count()
我需要能够过滤这个质量,例如所有的战斗机,其中50%<质量<80%。我想让我的博士后DB完成这项工作
我觉得应该可以通过Aggregate
来实现,但我不知道如何…您可以。使用该质量指标注释(…)
战斗机,然后使用给定范围进行过滤,如:
from django.db.models import Count, ExpressionWrapper, FloatField
Fighter.objects.annotate(
quality=ExpressionWrapper(
Count('wins', distinct=True)/Count('views', distinct=True),
output_field=FloatField()
)
).filter(
quality__range=(0.5, 0.8)
)
来自django.db.models导入计数、ExpressionWrapper、FloatField
Fighter.objects.annotate(
质量=ExpressionWrapper(
计数('wins',distinct=True)/计数('views',distinct=True),
输出\字段=浮动字段()
)
).过滤器(
质量范围=(0.5,0.8)
)
distinct=True
是必要的,因为否则质量总是1
:事实上,因为我们进行了两次联接,并且我们计算了视图的id
s和Win
s的id
s,但是这些数字总是匹配的
因此,quality\uu range=(0.5,0.8)
将过滤quality
注释,并使用0.5
下限和0.8
上限(包括两者)进行查找
ExpressionWrapper(…,outputField=FloatField())
是必需的,这样Django就可以理解quality
是一个float,否则它将0.5
和0.8
转换为int
,然后检查0
和0
之间的值您使用的是什么Django版本?最新版本,2.2