2017-04-22 49 views
0

我一直在玩這個小時而沒有找到解決方案。獲取已過濾項目的數量以及對模型的反向引用Django

我有以下型號:

class Category(models.Model): 
    name = models.CharField(max_length=100) 

class Item(models.Model): 
    name = models.CharField(max_length=250) 
    category = models.ForeignKey(Category) 

然後我篩選與該項目有關的項目和類別:

items = Item.objects.filter(name=name) 
categories = Category.filter(id__in = items.values_list('category__id')) 

現在我想要得到的物品的數量與類別並將該號碼保存在與類別相關的字段中annotate

我該怎麼辦?

回答

0

試試下面的代碼

from django.db.models import Count 

items = Item.objects.filter(name=name) 
categories = Category.objects.filter(
    id__in=items.values_list('category_id') 
).annotate(items_count=Count("item")) 

for cat in categories: 
    print cat.name, cat.items_count 

供參考:https://docs.djangoproject.com/en/1.11/topics/db/aggregation/

+0

這並不解決問題。 'Count(「item」)'將計算與每個類別相關的所有項目,包括那些沒有通過過濾器的項目。 –

0

然後我篩選項目,並與該項目有關的類別。

如果每個項目都可以指向幾個類別,我認爲您需要ManyToMany字段。

現在我想要得到的物品的數量與類別

category = Category.objects.filter(name=name) 
num_items = Item.objects.filter(category=category).count() 
+0

每個類別都有多個項目,但一個項目只有一個類別。我可以逐個獲取具有類別的項目的數量,但它會根據您的類別製作儘可能多的查詢。 –