相关疑难解决方法(0)

Django和Aggregate:不同值的总和?

我正在尝试执行django聚合函数,但无法产生所需的结果.

我得到了什么:

income_posts.values_list('category__name','amount')
[(u'Donation', Decimal("2000.00")), (u'Paycheck', Decimal("1200.00")), (u'Donation', Decimal("1000.00"))]
Run Code Online (Sandbox Code Playgroud)

期望的结果:

[(u'Donation', Decimal("3000.00")), (u'Paycheck', Decimal("1200.00))]
Run Code Online (Sandbox Code Playgroud)

我需要对具有相同category__name的'amount'字段求和.

django django-orm

12
推荐指数
4
解决办法
2万
查看次数

Django 注释对另一个注释有副作用

我遇到了一个问题,即向查询集添加注释会更改以前注释的结果。

这是(简化的)设置:

class Player(models.Model):
    name = models.CharField()

class Unit(models.Model):
    player = models.ForeignKey(Player, on_delete=models.CASCADE,
                               related_name='unit_set')

    rarity = models.IntegerField()

class Gear(models.Model):
    pass

class UnitGear(models.Model):
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE,
                             related_name='ug_set')
    gear = models.ForeignKey(Gear, on_delete=models.PROTECT)
Run Code Online (Sandbox Code Playgroud)

用稀有度 7 单位的数量来注释玩家效果很好:

Player.objects.annotate(
    rarity7_count=Count(unit_set__rarity=7)
).values_list('name', 'rarity7_count')

[('Player1', 170),
 ('Player2', 172),
 ('Player3', 164),
 ...,
)]
Run Code Online (Sandbox Code Playgroud)

上面返回的值rarity7_count是正确的。

如果我添加以下附加注释,情况就不再是这样:

Player.objects.annotate(
    rarity7_count=Count(unit_set__rarity=7),
    gear_count=Count(unit_set__ug_set)
).values_list('name', 'rarity7_count', 'gear_count')

[('Player1', 476, 456),
 ('Player2', 490, 466),
 ('Player3', 422, 433),
 ...,
)]
Run Code Online (Sandbox Code Playgroud)

请注意值是如何rarity7_count变化的——这些值不再正确!gear_count然而,的值是正确的。

这是为什么?如何让两个注释同时工作而不互相干扰?我已经尝试过各种各样的事情,但目前不知道如何做到这一点。

python django django-annotate

5
推荐指数
1
解决办法
1020
查看次数

Django - 注释多个 Sum() 对象会给出错误的结果

models.py看起来像这样

class Channel(Model):
    name = CharField()

class Contract(Model):
    channel = ForeignKey(Channel, related_name='contracts')
    fee = IntegerField()

class ContractPayment(Model):
    contract = ForeignKey(Contract, related_name='payments')
    value = IntegerField()
Run Code Online (Sandbox Code Playgroud)

当我查询模型时:

Channel.objects.annotate(pay=Sum('contracts__fee'))

它返回:75000。它是正确的,但是当我这样查询时:

Channel.objects.annotate(pay=Sum('contracts__fee'))
               .annotate(paid=Sum('contracts__payments__value'))
Run Code Online (Sandbox Code Playgroud)


它返回:pay: 96000,paid: 33000。如您所见,薪酬已更改。这里发生了什么?我读了票#10060但没有运气。

django django-models django-queryset

5
推荐指数
1
解决办法
389
查看次数