2016-11-23 16 views
0

我需要彙總訂單表中的數據,以確定每個日期銷售的物品總量。Django從非Queryset上下文數據創建表

我的訂單模式是這樣的:

class Order(models.Model): 
    guest = models.ForeignKey('hotel.Guest', on_delete=models.CASCADE) 
    date = models.DateField(auto_now_add=True) 
    amount = models.IntegerField() 
    item = models.ForeignKey('hotel.Item', on_delete=models.CASCADE) 
    price = models.IntegerField(default=1) 
    is_paid = models.BooleanField(default=False) 
    paid_date = models.DateField(blank=True, null=True) 

我現在已經創建了一個觀點,即隨着時間的推移和日期迭代:

def listAllOrders(request): 
    context = {} 
    orders = Order.objects.exclude(item__name = 'Room Rate') 
    item_dates = orders.values('date') 
    item_date = item_dates.order_by('date').distinct('date') 
    item_ids = orders.values('item__name') 
    item_id = item_ids.order_by('item__name').distinct('item__name') 
    inventory = [] 
    for d in item_date: 
     for i in item_id: 
      q=Order.objects.filter(item__name=i['item__name'], date=d['date']) 
      ta=q.aggregate(total_amount = Sum('amount')) 
      tp=q.aggregate(total_price = Sum('price')) 
      inventory.append([d['date'],i['item__name'],ta,tp]) 

    context['inventory'] = inventory 
    #context = Order.objects.all() 
    return render (request, 'hotel/inventory.html', context) 

如何我現在在一個表中填入這個數據我模板。如果我給一個QuerySet上下文我通常這樣做是這樣的:

<table class="table table-condensed table_orders"> 
    <tr> 
     <th>Date</th> 
     <th>Amount</th> 
     <th>Item</th> 
    </tr> 

{% for Order in inventory %} 
<tr> 
    <td>{{ Order.date }}</td> 
    <td>{{ Order.amount }}</td> 
    <td>{{ Order.item }}</td> 
</tr> 

{% endfor %} 
</table> 

這顯然並不在這裏,因爲在庫存數據未結構化的工作..我該怎麼解決這個問題?

回答

2

由於每Django's Variable and Lookup Document

點在模板呈現特殊的意義。變量名稱中的點表示查找。具體而言,當模板系統遇到變量名稱中的點時,它會按以下順序嘗試進行以下查找:

字典查找。例如:foo [「bar」]

屬性查找。示例:foo.bar

列表索引查找。例如:FOO [巴]


在您的庫存清單,你追加另一個列表。相反,以「dict」的形式附加它。如更換:

inventory.append([d['date'],i['item__name'],ta,tp]) 

有:

inventory.append({'date': d['date'], 
        'name': i['item__name'], 
        'amount': ta, 
        'price': tp}) 

和你的模板內,訪問它想:

{% for Order in inventory %} 
    <tr> 
     <td>{{ Order.date }}</td> 
     <td>{{ Order.name }}</td> 
     <td>{{ Order.amount }}</td> 
     <td>{{ Order.price }}</td> 
    </tr> 
{% endfor %} 

另外,如果你想在模板中訪問列表(在這裏建議的方法是使用map,但爲解釋目的解釋),即如果你做不想在當前視圖中進行任何更改,然後根據索引訪問列表中的項目。例如:

{% for Order in inventory %} 
    <tr> 
     <td>{{ Order.0 }}</td> 
     <td>{{ Order.1 }}</td> 
     <td>{{ Order.2 }}</td> 
     <td>{{ Order.3 }}</td> 
    </tr> 
{% endfor %}