ИМ
Игорь Максимов18 декабря 2018 г. 10:29

Одна модель для нескольких моделей

django, model

Доброго времени суток. Имеется модель для видео-контента (Movie), а конкретно привязана сейчас к одной модели(Compilation).
Появилась необходимость добавить еще одну модель (Category) и связать ее с основной(Movie).

Вот собственно как выглядит модель сейчас:

class Movie(models.Model):
    class Meta:
        db_table = 'movie'
        verbose_name = 'Фильм'
        verbose_name_plural = 'Фильмы'

    name = models.CharField(verbose_name='Название', max_length=200)
    orig_name = models.CharField(verbose_name='Оригинальное название', max_length=200, blank=True)
    poster = models.ImageField(
        # upload_to=curry(upload_to_media, prefix='posters'),
        upload_to=upload_to_media,
        blank=True,
        verbose_name='Постер'
    )
    compilation = models.ForeignKey(Compilation, on_delete=models.CASCADE, verbose_name='Подборки')
    year = models.DateField(verbose_name='Дата выхода', default='2000-01-01')
    country = models.CharField(verbose_name='Страна', max_length=300, default='Неизвестно')
    translate = models.CharField(verbose_name='Перевод', max_length=300, default='Русский')
    date = models.DateTimeField(verbose_name='Дата публикации')
    description = models.TextField(verbose_name='Описание')
    moder = models.BooleanField(verbose_name='Модерация', default=False)
    video = models.FileField(
        # upload_to=curry(upload_to_media, prefix='movies'),
        upload_to=upload_to_media,
        verbose_name='Видео'
    )
    votes = GenericRelation(LikeDislike, related_query_name='movies')

Теперь хотелось бы добавить поле category и выбирать куда постить контент или в category или в compilation.
Как можно реализовать данный вопрос?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

6
Evgenii Legotckoi
  • 18 декабря 2018 г. 13:04
  • (ред.)
  • Ответ был помечен как решение.

Добрый день!

По-моему в вашем случае нужно добавить второй внешний ключ на Category, а также поле выбора, в котором будет вид контента, так будет проще делать выборки, хотя можно и на null проверять. При этом оба поля могут быть установлены на null

class Movie(models.Model):

    CATEGORY = 'C'
    COMPILATION = 'M'
    MOVIE_TYPE_CHOICES = (
        (CATEGORY, 'Категории'),
        (COMPILATION, 'Подборки'),
    )
    type = models.CharField(
        'Тип',
        max_length=1,
        choices=MOVIE_TYPE_CHOICES,
        default=CATEGORY
    )
    category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='Категории', null=True)
    compilation = models.ForeignKey(Compilation, on_delete=models.CASCADE, verbose_name='Подборки', null=True)
    ИМ
    • 18 декабря 2018 г. 13:44

    Спасибо за решение Евгений. Еще вопрос что такое:

    CATEGORY = 'C'
    COMPILATION = 'M'
    

    и как можно при выборе одного из двух вариантов подгружать еще одно поле например playlist?

      Evgenii Legotckoi
      • 18 декабря 2018 г. 14:23

      Это просто своеобразные "константы", чтобы в коде удобнее было работать и код был более адекватным к модификациям.

      Например, если вы выставляете в коде значение переменной тип, то в данном случае это будет так

      movie_object.type = Movie.CATEGORY
      movie_object.save()
      

      Это именованная классовая переменная, которая в рамках разработки будет считаться константой (читайте внутреннее соглашение разработки между всеми разработчиками)

      Если так не делать, то во всём вашем проекте вы будете писать так

      movie_object.type = 'M'
      movie_object.save()
      

      Как результат, проект становится более трудно поддерживаемым, и в случае изменения 'M' на что-то другое придётся перелопатить весь проект, вместо изменения одной единственной строчки, да IDE не особо хорошо справится, если так не делать.

      и как можно при выборе одного из двух вариантов подгружать еще одно поле например playlist?

      не увидел этого поля в модели Movie и не знаю какие отношения оно имеет ко всем этим моделям. Подробнее, пожалуйста.

        ИМ
        • 18 декабря 2018 г. 14:42
        • (ред.)

        Спасибо за пояснение Евгений.

        По полю playlist:

        Хочу еще к модели Movie подключить модель Serial(так же как Compilation и Category), и вот тут мне нужно будет поле playlist для плеера.

        То есть при выборе варианта "Сериал" должно подгружаться поле (будущее поле) playlist. поле должно быть связано с (будущим) полем serial

          Evgenii Legotckoi
          • 18 декабря 2018 г. 14:58

          ну если у вас также будет внешний ключ на Serial, то получается следующая ситуация,

          Movie добавлен в Serial, а Serial имеет список Movie. То есть вам playlist как таковой вовсе не нужен.

          movie_object.serial.movie_set.all() # получаем список всех фильмов из сериала
          

          Помните, что я вам говорил про автоматически генерируемые методы по внешним ключам? вот это оно и есть в данном случае.

            ИМ
            • 19 декабря 2018 г. 6:31

            Спасибо вам Евгений, я разобрался.

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              AD

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:50баллов,
              • Очки рейтинга-4
              m
              • molni99
              • 26 октября 2024 г. 1:37

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:80баллов,
              • Очки рейтинга4
              m
              • molni99
              • 26 октября 2024 г. 1:29

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:20баллов,
              • Очки рейтинга-10
              Последние комментарии
              i
              innorwall14 ноября 2024 г. 21:26
              Qt/C++ - Урок 031. QCustomPlot - строим график по времени buy generic priligy We can just chat, and we will not lose too much time anyway
              i
              innorwall14 ноября 2024 г. 19:03
              Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
              i
              innorwall14 ноября 2024 г. 11:42
              Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
              i
              innorwall14 ноября 2024 г. 9:09
              Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
              Сейчас обсуждают на форуме
              i
              innorwall14 ноября 2024 г. 3:39
              добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
              i
              innorwall11 ноября 2024 г. 10:55
              Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
              9
              9Anonim25 октября 2024 г. 9:10
              Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
              ИМ
              Игорь Максимов3 октября 2024 г. 4:05
              Реализация навигации по разделам Спасибо Евгений!

              Следите за нами в социальных сетях