gpt4 book ai didi

python - 带有条件函数的Django查询何时(?)

转载 作者:行者123 更新时间:2023-11-29 12:18:01 24 4
gpt4 key购买 nike

我有一个餐厅的数据库:

class Product(models.Model):
name = models.CharField(max_length=250)
sides = models.ManyToManyField(Sides, blank=True)
price = models.DecimalField(max_digits=5, decimal_places=2)

def __unicode__(self):
return '%s %s %s' % (self.name, self.sides, self.price)

def __repr__(self):
return unicode(self).encode('utf-8')


class Menu(models.Model):
date = models.DateField()
product = models.ForeignKey(Product)

def __unicode__(self):
return '%s %s' % (self.date, self.product)

def __repr__(self):
return unicode(self).encode('utf-8')


class Order(models.Model):
date = models.DateField()
user = models.ForeignKey(User, null=True)

def __unicode__(self):
return '%s %s' % (self.date, self.user)

def __repr__(self):
return unicode(self).encode('utf-8')


class OrderItems(models.Model):
order = models.ForeignKey(Order)
product = models.ForeignKey(Menu, null=True, blank=True)
quantity = models.IntegerField(default=0)
take_away = models.BooleanField(default=False)

def __unicode__(self):
return '%s %s %s %s' % (self.order, self.product, self.quantity, self.take_away)

def __repr__(self):
return unicode(self).encode('utf-8')

我需要在数据库中搜索我的用户在给定时间段内订购的菜肴的成本,所以第一个查询非常简单:

report = OrderItems.objects.filter(Q(order__date__range=(strfrom, strto)), ~Q(order__user_id=None))

当涉及到计算这段时间每个用户的总成本时,问题就开始了,因为我必须为每个标记为带走的项目( bool 字段)加 1。到目前为止,我的查询忽略了 bool 字段,就像这样:

per_person = report.values('order__user').annotate(per_capita=Sum(F('quantity')*(F('product__product__price')), output_field=DecimalField()))

我的问题是:如何将 bool 字段标记为 True 的每个商品价格加 1?我假设我必须使用条件函数“When”。

我试过类似的方法:

report.values('order__user').annotate(per_capita=Sum(F('quantity')*(F(When('take_away'==True, then='product__product__price')+1)|(When('take_away'==False, then='product__product__price'))), output_field=DecimalField()))

但是,很明显,它给出了一个错误__init__() takes either a Q object or lookups as keyword arguments

最佳答案

您可以使用 Case-When。查看 https://docs.djangoproject.com/en/1.10/ref/models/conditional-expressions/#case 中的示例

.annotate(per_capita=Sum(
F('quantity') * (F('product__product__price') +
Case(When(take_away=True, then=Value(1)),
default_case=Value(0),
output_field=DecimalField())
)
))

关于python - 带有条件函数的Django查询何时(?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42340190/

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