Как связать иерархические данные с другой моделью в Django?

Рассмотрим следующие иерархические данные. Глубина может быть 3-4 уровня. Как я понимаю, я могу использовать существующие пакеты типа django-mptt или django-treebeard для создания древовидной структуры данных.

  • Мерседес
    • Потребитель
      • МодельА
      • МодельВ
    • SUV
      • МодельС
    • Люкс
      • МодельD
  • Nissan
    • Потребитель
      • МодельА
      • МодельВ
    • SUV
      • МодельС

Допустим, у меня есть еще одна модель под названием Battery. Батарея может быть совместима с несколькими моделями для разных сегментов рынка от разных производителей автомобилей. Поэтому я хочу назначить эту батарею одной или нескольким совместимым моделям выше. Я не уверен, как реализовать эту связь в Django. Будет ли это просто поле ManytoMany в иерархической модели? Помог бы какой-нибудь псевдокод.

class Battery(models.Model)
   name = Charfield(max_length=50)
   compatible_models = ????

Я также хотел бы узнать, как должен быть составлен запрос. Например, я хочу запросить все аккумуляторы, совместимые с ModelA от Mercedes и т.д.

Думаю, вам подойдет следующее (на чистом Django):

class CarBrand(models.Model):
    brand_name = models.CharField(...)
   
class CarType(models.Model):
    type_name = models.CharField(...)
    available_brands = models.ManyToManyField(CarBrand)

class ModelType(models.Model):
    model_name = models.CharField(...)
    available_car_types = models.ManyToManyField(CarType)

class BatteryType(models.Model):
    battery_name = models.CharField(...)
    supported_models = models.ManyToManyField(ModelType)

Вы запросите "Батареи" следующим образом:

BatteryType.objects.filter(
supported_models__model_name='ModelA',supported_models__available_car_types__available_brands__brand_name='Mercedes'
)
Вернуться на верх