Django Models, у меня есть вложенные категории, какой лучший способ убедиться, что каждый объект будет "реагировать" на свою категорию и родительские категории?
У меня есть модель для вложенных категорий, которую я нашел в Интернете и которая работает очень хорошо:
class Category(models.Model):
parent = models.ForeignKey('self', related_name='children', on_delete=models.CASCADE, blank=True, null=True)
title = models.CharField(max_length=100)
class Meta:
unique_together = ('title', 'parent')
def __str__(self):
full_path = [self.title]
k = self.parent
while k is not None:
full_path.append(k.title)
k = k.parent
return '/'.join(full_path[::-1])
У меня также есть другая модель, "стандартная" модель, которая имеет поле категории (до этого момента оно было просто внешним ключом). Моя проблема в том, какой "правильный" способ убедиться, что объект будет реагировать на более чем одну категорию здесь? Я имею в виду, если у меня есть объект Fiat/Opel/Ferrari, и у меня есть такие категории, как:
- Средства передвижения
- Наземный транспорт
- Машины
- Морской транспорт
- Наземный транспорт
Затем я присвою объекту "Fiat/Opel/Ferrari" категорию "Автомобили", но я также хочу, чтобы он реагировал на категории "Наземный транспорт" и "Средства транспорта". Мне интересно, какой лучший/наиболее эффективный способ сделать это.
В настоящее время у меня есть такие идеи, как:
- каждая категория имеет по умолчанию пустые поля, такие как бабушка, дедушка, бабушка, дедушка и т.д., которые я буду заполнять и добавлять в запросы.
- Моя категория могла бы быть ManytoMany вместо внешнего ключа, и я бы вручную установил все категории.
У меня нет большого количества данных, поэтому оба варианта будут работать для меня хорошо, но я могу только догадываться, что это как-то "известная" проблема проектирования и что "правильный" ответ действительно существует и отличается от двух моих первоначальных идей.
Мог бы кто-нибудь помочь мне с этим?
РЕДАКТ: Я также подумал о некотором рекуррентном запросе по родителям категории, затем по родителям родительской категории и т.д. и после этого сделать фактический запрос на соответствующий транспортный объект, но это было бы довольно неэффективно, я думаю