Django QuerySet中特定列的平均重复项

我有一个正在使用的Django模型,如下所示:

class FinancialAid(models.Model):
    RECEIVED_EVERY = (("J","Jours"),("S","Semaines"),("M","Mois"))
    ID = models.AutoField(primary_key=True)
    Name = models.CharField(max_length=100,null=True,blank=True)
    Value = models.IntegerField(null=True,blank=True,default=-1)
    ReceivedEvery = models.CharField(max_length=15,choices=RECEIVED_EVERY)
    Exchange = models.ForeignKey('Exchange',on_delete=models.CASCADE)

我能够访问所需的信息,但是存在一个问题,我的QuerySet中经常在NameReceivedEvery列上有重复项,但并不总是在Value上永远不要在Exchange上。

说我扩展了以下QuerySet:

financial_aid_qs = [
    (ID=1,Name="Aid1",Value=100,ReceivedEvery="M",Exchange=Exchange.objects.get(pk=1)),(ID=2,Name="Aid2",Value=200,ReceivedEvery="S",Exchange=Exchange.objects.get(pk=2)),(ID=3,Value=150,Exchange=Exchange.objects.get(pk=3)),(ID=4,Name="Aid3",Exchange=Exchange.objects.get(pk=4))
]

如您所见,索引1和3具有相同的NameReceivedEvery。我想做的是获取QuerySet(或ValuesQuerySet,尽管我似乎记得已删除了它) ),将包含所有Name不同的FinancialAid对象,并对Value相同的FinancialAid对象的Name进行平均。理想情况下,应考虑到ReceivedEvery相同的情况下Name可以有所不同的事实(这只是一个平均值,因此不需要是完美的,因此,一个月是30天或4周)。

有了这些,结果应该看起来像这样:

financial_aid_qs = [
    (Name="Aid1",Value=125,ReceivedEvery="M"),(Name="Aid2",ReceivedEvery="S"),(Name="Aid3",ReceivedEvery="M")
]

如您所见,对于Aid1,该值已从100和150取平均值到125,而其他Aid尚未修改。

wu379611988 回答:Django QuerySet中特定列的平均重复项

使用values()汇总分组查询,例如:

financial_aid_qs = FinancialAid.objects.values("Name").annotate(avg_value=Avg("Value"))

这将返回字典的查询集(执行列表时):

financial_aid_qs = [
    {'Name': "Aid1",'avg_value': 125},{'Name': "Aid2",'avg_value': 200},...
]

如果您还想通过ReceivedEvery进行区分,则只需按两个值进行分组:

financial_aid_qs = FinancialAid.objects.values('Name','ReceivedEvery').annotate(...)

>>> [{'Name': "Aid1",'ReceivedEvery': "M",{'Name': "Aid1",'ReceivedEvery': "S",...]

在这里,每周和每月的捐款将以相同的“名称”分开。

使用conditional expression来创建取决于其他值的新值:

financial_aid_qs = FinancialAid.objects.annotate(
    factor=Case(
        When(ReceivedEvery="S",then=Value(4)),When(ReceivedEvery="M",then=Value(1)),output_field=IntegerField()
    )).annotate(
        total=F('factor')*F('Value')
    ).values('Name').annotate(
        avg_value=Avg('total')
    )
本文链接:https://www.f2er.com/3082561.html

大家都在问