gpt4 book ai didi

python - Django "extra"查询

转载 作者:行者123 更新时间:2023-12-01 06:00:00 25 4
gpt4 key购买 nike

我的 models.py 中有以下模型结构,其中包含项目和优惠:

class Item(models.Model):

STATUS_CHOICES = (
('A', 'Active'),
('C', 'Cancelled'),
)

status = models.CharField(max_length=11, choices=STATUS_CHOICES)
target_amount = models.PositiveIntegerField()
...

class Offer(models.Model)

STATUS_CHOICES = (
('A', 'Active'),
('C', 'Cancelled'),
)

status = models.CharField(max_length=11, choices=STATUS_CHOICES)
amount = models.PositiveIntegerField()
item = models.ForeignKey(Item)
...

我想在我的views.py中编写一个查询来获取每个项目的以下信息:

  1. 该商品的当前(有效)优惠总数
  2. 该商品的报价已达到目标的百分比(即[(1) 中的总和]/target_amount * 100)

我一直在尝试通过“额外”来实现这一点,如下所示(使用 postgres):

items = Item.objects.filter(status='A').extra(
select={
'total_amount' : 'select coalesce(sum(amount),0) from myapp_offer where myapp_offer.item_id = myapp_item.id and myapp_offer.status = \'A\'',
'percentage_met' : '(((select coalesce(sum(amount),0) from myapp_offer where myapp_offer.item_id = myapp_item.id and myapp_offer.status = \'A\') / target_amount) * 100)'
}
)

现在第一个选择 (total_amount) 工作正常并返回我所期望的结果,但 percentage_met 始终为 0。任何人都可以帮我解决为什么吗?

编辑:应该提到我希望能够按百分比进行排序

最佳答案

为此您不需要额外。只需使用 aggregation :

from django.db.models import Sum

items = Item.objects.filter(status='A').annotate(total_amount=Sum('offer__amount'))
无论如何,

percentage_met 是每个对象的,因此它可以只是模型上的一个方法:

class Item(models.Model):
...
@property
def percentage_met(self):
if hasattr(self, 'total_amount'):
return (self.total_amount / float(self.target_amount)) * 100
return None

关于python - Django "extra"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com