2017-02-20 58 views
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

回答

1

您可以使用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()) 
    ) 
)) 
+0

這樣做了。謝謝! – ZmuA

+0

我很高興它有幫助。如果你喜歡它,請不要忘記提高答案=) – JoseKilo

+0

有沒有辦法檢查'F('quantity')*(F('product__product__price')'的結果是否給出了比12更大的結果?Case and如果是這樣,我該如何在我的查詢中實現這樣的測試? – ZmuA