Как связать иерархические данные с другой моделью в 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'
)