@Tiran_94
Python Django

Как лучше построить связи между моделями в Django?

Есть главная модель "Запчасть", у нее есть поля которые связаны с категориями, моделями "Марка авто, Модель авто, Модификация, Двигатель".
  • У марки может быть много моделей
  • У модели много модификаций
  • У модификации много двигателей

То есть они объединяются с помощью ForeignKey, а Запчасть может иметь все это. При редактировании в админ панели Django они не объединены и если привязать к запчасти Марку авто, то кроме марки я ничего больше не увижу, а если вывести двигатель как конечную точку можно увидеть примерно что то такое:
Toyota | Mark 2 | GX61 | 1G-EU
Toyota | Mark 2 | GX61 | 1G-GEU
Toyota | Mark 2 | GX61 | 1G-GE
5c1227b8c5639143062364.png

Подскажите как лучше организовать связи между моделями и присоединить их к "Запчасть"?
Пример того что есть:
from django.db import models
from django.utils.text import slugify
from time import time


class BrandCar(models.Model):
    name = models.CharField(max_length=50, verbose_name='Марка Авто')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Марка"
        verbose_name_plural = "Марки"


class ModelCar(models.Model):
    name = models.CharField(max_length=50, verbose_name='Модель Авто')
    brand_car = models.ForeignKey('BrandCar', on_delete=models.CASCADE, verbose_name='Марка Авто')

    def __str__(self):
        return 'Марка: {}, Модель: {}'.format(self.brand_car, self.name)

    class Meta:
        verbose_name = "Модель"
        verbose_name_plural = "Модели"


class ModificationCar(models.Model):
    name = models.CharField(max_length=50, verbose_name='Модификация Авто')
    model_car = models.ForeignKey('', on_delete=models.CASCADE, verbose_name='')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Модификация Авто"
        verbose_name_plural = "Модификации Авто"


class TypePart(models.Model):
    name = models.CharField(max_length=50, verbose_name='Тип Запчасти')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Тип Запчасти"
        verbose_name_plural = "Тип Запчасти"


class EngineCar(models.Model):
    name = models.CharField(max_length=50, verbose_name='Двигатель Авто')
    modification_car = models.ForeignKey('ModificationCar', on_delete=models.CASCADE, verbose_name='Модификация')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = "Двигатель"
        verbose_name_plural = "Двигателя"


def gen_slug(s):
    new_slug = slugify(s, allow_unicode=True)
    return new_slug + '-' + str(int(time()))


class SparePart(models.Model):
    name = models.CharField(max_length=50, verbose_name='Запчасть')
    number = models.CharField(max_length=50, verbose_name='Номер Запчасти', blank=True, )
    description = models.TextField(verbose_name='Описание', blank=True, )
    image = models.ImageField(upload_to='', verbose_name='Главное Изображение')
    price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='Цена')
    date = models.DateField(verbose_name='Дата')
    brand_car = models.ManyToManyField('BrandCar', verbose_name='Марка Авто')
    models_car = models.ManyToManyField('ModelCar', verbose_name='Модель Авто')
    modifications_car = models.ManyToManyField('ModificationCar', verbose_name='Модификация Авто')
    engines_car = models.ManyToManyField('EngineCar', verbose_name='Мотор/Двигатель')
    type_part = models.ForeignKey('TypePart', on_delete=models.CASCADE, verbose_name='Тип Запчасти')
    slug = models.SlugField(max_length=150, blank=True, unique=True)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = gen_slug(self.name)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['-date']
        verbose_name = "Запчасть"
        verbose_name_plural = "Запчасти"


class ImageCar(models.Model):
    image = models.ImageField(upload_to='')
    spare_part = models.ForeignKey('SparePart', on_delete=models.CASCADE, verbose_name='Изображение для Запчасти')

    def __str__(self):
        return '{}'.format(self.spare_part.name)

    class Meta:
        verbose_name = "Изображение"
        verbose_name_plural = "Изображения"
  • Вопрос задан
  • 389 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы