2010-01-13 82 views
7

我试图在Django的维基使用类似类别实施this one。我想知道Django的搜索方式是如何拉取与父类关联的所有对象。例如,如果我有一个“电视”类别,并且它有子类别“LED”,“LCD”和“等离子”,我将如何轻松查询所有电视而无需递归查看所有子类别和子子类别(如果有是任何)。Django的类别和子类别的搜索

代码明智的,我想是这样的:

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

所以这种类型的实现是有没有简单的方法做什么,我需要的,或者是有其他更好的解决办法?

谢谢!您正在使用的Category模型它被你所引用的页面上使用的相同方式

+0

项目可以在多个类别? – czarchaic 2010-01-14 00:21:45

+0

不是他们只能在一个类别中,但他们也会是父类别(类似于继承) – 2010-01-14 02:23:23

回答

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')

5

假设,它似乎是一个类别“TV”将是一个Category实例与空parent,和“等离子” &“LCD '将'Category作为父母'TV'类别的实例。

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

创建一些项目

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

获得该项目的queryset

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

>>>> items=Item.objects.filter(category__parent__name='TV') 

这看起来就像是在你需要什么球场?

+0

这是否能够做子类别?例如,如果Vizio实际上是另一个类别,然后有这样一个项目: specific_model_number = Item(name =“model43534”,category = vizio) would not“items = Item.objects.filter(category__parent =电视)“ 不返回结果集中的specific_model_number对象? – 2010-01-14 14:50:16

+0

你可以编辑你的文章,或添加一个你将使用的代码类型的答案,并概述你的担忧?我正在试图准确理解你需要什么。例如,在上面的queryset中,当循环它时,每个项目都会有一个名称和一个“Category”。在您的应用程序中是否有可能将vizio作为父类(即子子类)? – czarchaic 2010-01-14 15:03:10

+0

是一个类别可以让vizio作为父类。我担心的是,查询集不会返回类别树子集中的每个项目。如果我有一个查询集“category__parent = tv”,即使它们是树中的2个节点,我是否还会得到所有返回的“vizio”项?我不知道如何编辑帖子以更好地解释它,所以我很抱歉,因为它很混乱,我非常感谢你的帮助。 – 2010-01-14 15:25:04

0

如果您正在使用Django - 类别,它采用MPTT那么你就可以做到以下几点:

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