2013-03-11 26 views
0

在Django中,我有兩種模型,Cateogory和Product,Product reference Category以這種方式。Django過濾對象的某些參考條件

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

class Product(models.Model): 
    category = models.ForeignKey(Category, null=True) 

我想獲得至少一個產品引用的所有類別。

我獲得我的目標與此解決方案:

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

     def has_product(self): 
      products = self.product_set.all() 
      if(len(products) > 0): 
        return True 
      else: 
        return False 

category_list = [] 

for cat in Category.objects.all(): 
     if cat.has_products(): 
      category_list.append(cat) 

是否有更聰明的解決方案?

回答

2

你可以用一個列表理解做到這一點:

cats_with_prod = [c for c in Category.objects.all() if c.product_set.exists()] 

但是你可以在數據庫完全做到這一點,在一個查詢:

cats_with_prod = Category.objects.filter(product_set__isnull=False).distinct() 
2

看起來你可以用一個列表理解這樣做:

cats_with_prod = [c for c in Category.objects.all() if c.product_set.exists()] 
+1

或'if c.product_set.exists()'。 – 2013-03-11 20:32:27

+0

@PavelAnossov謝謝,這似乎更有效(re:https://docs.djangoproject.com/en/dev/ref/models/querysets/#when-querysets-are-evaluated),將會進行編輯。 – mVChr 2013-03-11 20:35:18