Django通过一些引用条件过滤对象

时间:2013-03-11 20:23:53

标签: django reference filtering

在Django中我有两种型号,Cateogory和Product,产品参考类别就是这样。

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 个答案:

答案 0 :(得分:2)

看起来你可以用一个列表理解来做到这一点:

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

答案 1 :(得分:2)

你可以用列表理解来做到这一点:

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

但是您可以在一个查询中完全在DB中完成:

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