django类别列表(父母子女)

时间:2012-01-04 17:02:18

标签: django

我有一个包含父子关系的类别列表:

class Categories(models.Model):
  cat_name = models.Charfield()
  cat_parent = models.ForeignKey('self')

所以我想列出它们:

Category 1
  Sub category 1
  Sub category 2
  Sub category 3
Category 2
  Sub category 4
  Sub category 5

等...

最好的方法是什么?

3 个答案:

答案 0 :(得分:4)

取决于你的实际用例,这可能有点过分,但看看django-mptt,(修改的预订树遍历),这是一个简化使用sql数据库处理分层数据的库(在此case,django)

答案 1 :(得分:2)

你可以这样做

categories ={}

map(lambda c: categories.setdefault(c.cat_parent, []).append(c),\
    Categories.objects.filter(cat_parent__isnull=False)\
        .select_related('cat_parent'))

你会得到categories

这样的词典
{
    Category 1 : [Sub category 1, Sub category 2, Sub category 3],
    Category 2 : [Sub category 4, Sub category 5]
}

然后在你的模板中

{% for category, sub_categories in categories.items %}
    {{ category.name }}
    {% for sub_category in sub_categories %}
        {{ sub_category }}
    {% endfor %}
{% endfor %}

答案 2 :(得分:0)

那这样的事情呢?

class Categories(models.Model):
  name = models.Charfield(max_length=255)
  category = models.ManyToManyField('self', blank=True)
  is_parent = models.BooleanField()

  def __str__(self)
     return self.name

这样,您可以将父级和子级存储在同一模型集中,并将它们引用回父级。然后,在您的ViewSet上,您可以执行以下代码以返回父字典:

queryset = Category.objects.filter(is_parent=True)

看起来像这样:

{
    "name": "Parent Category",
    "category": [
        "1",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
    ],
    "is_parent": true
},
{
    "name": "Parent Category 2",
    "category": [
        "8",
        "9",
        "10",
    ],
    "is_parent": true
},

希望它能对我有所帮助。