Множественные вложенные варианты в моделях Django

Простите меня, если я описываю это неправильно - я все еще учусь и я натолкнулся на стену с проблемой, над которой я работаю. Я хочу создать способ (пока в бэкенде Admin) для пользователей показывать книги, которые им нравятся, по художественной/нехудожественной литературе, возрастному диапазону, жанру(ам) и поджанру(ам). Так, пользователь, которому нравятся готические книги ужасов, может выбрать fiction>adult>horror>gothic. Или пользователь, которому нравятся буквально все книги YA, может выбрать fiction>Young Adult, и его выбор будет каскадировать вниз на каждый жанр и поджанр.

Я думаю что опция поля Choices и функциональность MultiSelectField могут быть началом, но, похоже, нет способа добавить "слои" к выбору, помимо категорий ниже, и это кажется неэлегантным решением, когда могут быть сотни вариантов. Я также не знаю, как это можно представить в админке - в идеале с флажками, которые могут "открываться", чтобы показать подкатегории под ними.

    GENRE_CHOICES = (
    ('Fiction', (
        ('FCH', 'Childrens'),
        ('FMG', 'Middle Grade'),
        ('FYA', 'Young Adult'),
        ('FAD', 'Adult'),
    )),
    ('Non-Fiction', (
        ('NCH', 'Childrens'),
        ('FMG', 'Middle Grade'),
        ('FYA', 'Young Adult'),
        ('FAD', 'Adult'),
    )),
)
genres = MultiSelectField(max_length = 100, choices=GENRE_CHOICES, null=True)

Я даже не знаю названия того, что я ищу здесь, так что если кто-то может указать мне правильное направление, это было бы здорово.

Если вы хотите, чтобы пользователь мог фильтровать список книг на основе своих предпочтений, то смотрите django-filter https://django-filter.readthedocs.io/en/stable/index.html
. (к сожалению, у меня нет достаточной репутации, чтобы написать это в комерцию)

То, что вы ищете - это "древовидная структура". Вы можете определить ее различными способами, например, так, как вы реализуете дерево в базе данных:

class Tree(models.Model):
  parent = models.ForeignKey('self', ...)

Но есть лучший подход, который чем-то похож на то, что вы хотели использовать в первую очередь, пожалуйста, обратитесь к django-mptt TreeNodeMultipleChoiceField

Вернуться на верх