список категорий django (родительский ребенок) - PullRequest
5 голосов
/ 04 января 2012

У меня есть список категорий с родителями и детьми:

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 ]

4 голосов
/ 04 января 2012

в зависимости от вашего фактического варианта использования, это может быть излишним, но посмотрите на django-mptt , (Modified Preorder Tree Traseal), библиотеку, которая упрощает работу с иерархическими данными с использованием базы данных sql (и, в данном случае, django)

2 голосов
/ 04 января 2012

Вы можете сделать это так

categories ={}

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

И вы получите categories dict like

{
    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 %}
0 голосов
/ 26 сентября 2018

Что-то вроде этого:

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 вы можете выполнить приведенный ниже код, чтобы вернуть родительский dict:

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
},

Надеюсь, это поможет, это, безусловно, помогло мне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...