Множественные вложенные варианты в моделях 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