Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django通过2个外键的计算值进行过滤_Django_Django Models_Filter_Foreign Keys - Fatal编程技术网

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