Django类别和子类别搜索

时间:2010-01-13 23:25:59

标签: django django-models django-queryset

我正在尝试在Django Wiki中对this one使用类似的Category实现。我想知道Django的搜索方式是什么来拉取与父类相关联的所有对象。例如,如果我有一个类别“电视”,它有子类别“LED”,“LCD”和“等离子”,我怎么能够轻松查询所有电视,而无需递归遍历所有子类别和子类别(如果有)是任何)。

代码明智我想的是:

class Item(models.Model):
   name = ...
   ...
   category = models.ForeignKey(Category, null=True, blank=True)

所以有了这种类型的实现,有什么简单的方法可以做我需要的,或者还有其他更好的解决方案吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

如果您想强制执行严格的类别和子类别,但也能够使用您描述的结果执行快速搜索,您可能需要创建一个“标记”表,而您实际上不允许用户自己标记项目,但是,只要您将一个类别分配给一个项目,就可以填写该项目的标记表,其中所有父类别一直到类别树的根节点。

例如,如果您有以下内容: alt text http://img509.yfrog.com/img509/9845/photoho.jpg

标签表看起来像:

   id   |   tag_name   |   tv_id
   1    |     "tv"     |     1
   2    |     "sd"     |     1    
   3    |     "crt"    |     1  
   4    |     "tv"     |     2  
   5    |     "HD"     |     2  
   6    |     "LCD"    |     2  
   7    |     "tv"     |     3  
   8    |     "HD"     |     3  
   9    |   "plasma"   |     3

现在您的查询集看起来像items=Item.objects.filter(tag='TV')

答案 1 :(得分:5)

假设您使用Category模型的方式与您引用的页面上使用的方式相同,那么“TV”类似乎是Category个实例,其中包含null {{ 1}}和'等离子'& 'LCD'将是parent个实例,其中'TV'类别作为父级。

Category

创建一些项目

>>> tv=Category(name="TV")
>>> tv.save()
>>> lcd=Category(name="LCD", parent=tv)
>>> lcd.save()
>>> plasma=Category(name="Plasma", parent=tv)
>>> plasma.save()

获取Item queryset

>>> vizio=Item(name="Vizio", category=lcd)
>>> vizio.save()
>>> plasmatron=Item(name="PlasmaTron", category=plasma)
>>> plasmatron.save()

>>> items=Item.objects.filter(category__parent=tv)

这看起来像是你需要的球场吗?

答案 2 :(得分:0)

如果您使用的是使用MPTT的django-categories,那么您可以执行以下操作:

Entry.objects.filter(category__in=category.get_descendants(True))