2
我有一個小餐館的數據庫(?):Django的查詢與條件功能當
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()))
我的問題是:我怎麼能加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
。
這樣做了。謝謝! – ZmuA
我很高興它有幫助。如果你喜歡它,請不要忘記提高答案=) – JoseKilo
有沒有辦法檢查'F('quantity')*(F('product__product__price')'的結果是否給出了比12更大的結果?Case and如果是這樣,我該如何在我的查詢中實現這樣的測試? – ZmuA