Django类别和子类别搜索

Jor*_*ina 7 django django-models django-queryset

我试图用类似的分类实施,这一个在Django的维基.我想知道Django的搜索方式是什么来拉取与父类相关联的所有对象.例如,如果我有一个类别"电视"并且它有子类别"LED","LCD"和"等离子",我怎么能够轻松查询所有电视,而无需递归遍历所有子类别和子类别(如果有的话)是任何).

代码明智我在想像:

class Item(models.Model):
   name = ...
   ...
   category = models.ForeignKey(Category, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

所以这种类型的实现是否有任何简单的方法来做我需要的,或者还有其他更好的解决方案吗?

谢谢!

goh*_*tis 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
Run Code Online (Sandbox Code Playgroud)

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


cza*_*aic 5

假设您使用的Category模型与您引用的页面上使用的模型相同,似乎类别"TV"将是一个Category带有null 的实例parent,而"Plasma"和"LCD"将是Category带有'的实例电视'作为父母的类别.

>>> tv=Category(name="TV")
>>> tv.save()
>>> lcd=Category(name="LCD", parent=tv)
>>> lcd.save()
>>> plasma=Category(name="Plasma", parent=tv)
>>> plasma.save()
Run Code Online (Sandbox Code Playgroud)

创建一些项目

>>> vizio=Item(name="Vizio", category=lcd)
>>> vizio.save()
>>> plasmatron=Item(name="PlasmaTron", category=plasma)
>>> plasmatron.save()
Run Code Online (Sandbox Code Playgroud)

获取Item查询集

>>> items=Item.objects.filter(category__parent=tv)
Run Code Online (Sandbox Code Playgroud)

要么

>>>> items=Item.objects.filter(category__parent__name='TV')
Run Code Online (Sandbox Code Playgroud)

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