2012-09-03 53 views
0

我試圖找出如何解決這個扭轉許多人在Django +許多領域盡數

class Item(models.Model): 
    type = models.ForeignKey(Type) 
    name = models.CharField(max_lenght = 10) 
    ... 

class List(models.Model): 
    items = models.ManyToManyField(Item) 
    ... 

我想算一個項目有多少會出現在另一個列表,並顯示模板。

視圖

def items_by_list(request, id_): 
    list = List.objects.get(id = id_) 
    qr = list.items.all() 

    #NOT TESTED 

    num = [] 
    i = 0 
    for item in qr: 
     num[i] = List.objects.filter(items__id = item__id).count() 

    #FINISH NOT TESTED 

    c = {} 
    c.update(csrf(request)) 
    c = {'request':request, 'list' : qr, 'num' : num} 
    return render_to_response('items_by_list.html', c, context_instance=RequestContext(request)) 

模板

{% for dia in list %} 
      <div class="span4" > 
       <div> 
        <h6 style="color: #9937d8">{{item.type.description}}</h6> 
        <small style="color: #b2e300">{{ item.name }}</small> 
        <small style="color: #b2e300">{{COUNT HOW MANY TIMES THE ITEM APPEAR ON OTHER LISTS}}</small> 

       </div> 
    {% endfor %} 

這似乎很容易,但我不能落實呢。

如果有人給我一些膠水,請幫助我。

在此先感謝。

回答

2

如果你使用Django 1.3+,然後用aggregation

from django.db.models import Count  
queryset = List.objects.annotate(item_count=Count('item')) 

每個List實例在這個查詢集將有ITEM_COUNT屬性,你可以在你的模板中顯示。您會在文檔中找到更多示例。

0

我想要的方式是,輕鬆的方法是在類Items上創建一個方法。

def get_num_item(self): 
    return Lista.objects.filter(item__id = self.id).count() 

我很慚愧。

謝謝,謝夫!