【发布时间】:2017-07-09 11:22:57
【问题描述】:
我有一个餐厅的数据库:
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))
问题开始于计算此期间每位用户的总成本,因为我必须为每个已标记为外卖的项目加 1(布尔字段)。到目前为止,我的查询忽略了布尔字段,就像这样:
per_person = report.values('order__user').annotate(per_capita=Sum(F('quantity')*(F('product__product__price')), output_field=DecimalField()))
我的问题是:如何将布尔字段标记为 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。
【问题讨论】:
标签: python django postgresql django-queryset