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)
所以这种类型的实现是否有任何简单的方法来做我需要的,或者还有其他更好的解决方案吗?
谢谢!
如果您想强制执行严格的类别和子类别,但也能够使用您描述的结果执行快速搜索,您可能需要创建一个"标记"表,其中您实际上不允许用户自己标记项目,而是一旦为项目分配了一个类别,就可以填写该项目的标记表,其中所有父类别一直到类别树的根节点.
例如,如果您有以下内容: 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')
假设您使用的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)
这看起来像是你需要的球场吗?