7

我正在尝试在 Django Wiki 中使用与此类似的 Category 实现。我想知道 Django 进行搜索以提取与父类别关联的所有对象的方式是什么。例如,如果我有一个类别“电视”并且它有子类别“LED”、“LCD”和“等离子”,我如何能够轻松查询所有电视而不递归地遍历所有子类别和子子类别(如果有是任何)。

明智的代码我在想这样的事情:

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

因此,通过这种类型的实现,有什么简单的方法可以满足我的需要,还是有其他更好的解决方案?

谢谢!

4

3 回答 3

8

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

例如,如果您有以下内容: 替代文字 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')

于 2010-01-14T19:00:13.120 回答
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()

创建一些项目

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

获取项目查询集

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

或者

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

这看起来像是在您需要的范围内吗?

于 2010-01-14T06:02:02.007 回答
0

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

Entry.objects.filter(category__in=category.get_descendants(True))
于 2013-06-25T23:41:54.387 回答