我正在尝试在Django Wiki中对this one使用类似的Category实现。我想知道Django的搜索方式是什么来拉取与父类相关联的所有对象。例如,如果我有一个类别“电视”,它有子类别“LED”,“LCD”和“等离子”,我怎么能够轻松查询所有电视,而无需递归遍历所有子类别和子类别(如果有)是任何)。
代码明智我想的是:
class Item(models.Model):
name = ...
...
category = models.ForeignKey(Category, null=True, blank=True)
所以有了这种类型的实现,有什么简单的方法可以做我需要的,或者还有其他更好的解决方案吗?
谢谢!
答案 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))