【问题标题】:Django Category and Subcategory searchesDjango 类别和子类别搜索
【发布时间】:2011-01-04 21:19:37
【问题描述】:

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

代码方面我在想这样的事情:

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

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

谢谢!

【问题讨论】:

  • 项目可以属于多个类别吗?
  • 不,它们只能属于一个类别,但它们也将属于父类别(有点像继承)

标签: django django-models django-queryset


【解决方案1】:

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

例如,如果您有以下情况: 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')

【讨论】:

    【解决方案2】:

    假设您使用Category 模型的方式与您引用的页面上使用它的方式相同,那么类别“TV”似乎是一个Category 实例,其中parent 为空,并且' Plasma' & '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()
    

    获取项目查询集

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

    或

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

    这看起来是否符合您的需求?

    【讨论】:

    • 这可以做子类别吗?例如,如果 Vizio 实际上是另一个类别,然后有一个像这样的项目:specific_model_number = Item(name="model43534", category=vizio) would not "items=Item.objects.filter(category__parent=tv)" not返回结果集中的 specific_model_number 对象?
    • 您能否编辑您的帖子,或添加您将使用的代码类型的答案并概述您的疑虑?我试图准确地了解你需要什么。例如在上面的查询集中,当循环遍历它时,每个项目都会有一个名称和一个Category。在您的应用程序中,是否可以将 vizio 作为父类别(即子子类别)?
    • 是的,一个类别可以有 vizio 作为父级。我担心的是查询集不会返回类别树子集中的每个项目。如果我有一个仅用于“category__parent=tv”的查询集,即使它们是树下的 2 个节点,我会得到所有返回的“vizio”项目吗?我不知道如何编辑帖子以更好地解释它,所以我很抱歉,因为它令人困惑,我非常感谢你到目前为止的帮助。
    • 我要去上班了,所以我会在回家后更新,但是一个简短的问题。我的回复中的代码是否看起来像您的应用所期望的那样。 (即我们在正确的轨道上吗?)。你能给我一些关于Category 可能有lcd 或plasma 作为父母的想法吗?
    • 嗨,乔丹,在我深入研究您的代码之前,还有一个简短的问题。类别可以深入到什么程度?是否有可能有一个类别40inch,其父flatscreen 本身有一个父vizio,其父为lcd,其父为tv? (假设)
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-28
      • 1970-01-01
      • 2016-10-22
      • 2015-04-05
      相关资源
      最近更新 更多