ИМ
Игорь Максимов18 декабря 2018 г. 21: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
  • 19 декабря 2018 г. 0: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)
    ИМ
    • 19 декабря 2018 г. 0:44

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

    CATEGORY = 'C'
    COMPILATION = 'M'
    

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

      Evgenii Legotckoi
      • 19 декабря 2018 г. 1:23

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

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

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

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

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

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

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

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

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

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

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

        По полю playlist:

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

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

          Evgenii Legotckoi
          • 19 декабря 2018 г. 1:58

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

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

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

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

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

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

              Комментарии

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

              Qt - Тест 001. Сигналы и слоты

              • Результат:84баллов,
              • Очки рейтинга4
              Ua

              Qt - Тест 001. Сигналы и слоты

              • Результат:42баллов,
              • Очки рейтинга-8
              ОК

              Qt - Тест 001. Сигналы и слоты

              • Результат:47баллов,
              • Очки рейтинга-6
              Последние комментарии
              ИМ
              Игорь Максимов22 ноября 2024 г. 21:51
              Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              Evgenii Legotckoi
              Evgenii Legotckoi31 октября 2024 г. 23:37
              Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
              A
              ALO1ZE19 октября 2024 г. 17:19
              Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
              ИМ
              Игорь Максимов5 октября 2024 г. 16:51
              Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
              d
              dblas55 июля 2024 г. 20:02
              QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
              Сейчас обсуждают на форуме
              f
              firstlunoxod15 февраля 2025 г. 13:46
              Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
              Дмитрий
              Дмитрий3 февраля 2025 г. 16:24
              Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
              NW
              Nayo Wai30 января 2025 г. 19:22
              не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
              n
              nkly3 января 2025 г. 12:52
              Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
              M
              Marsel17 августа 2023 г. 0:26
              OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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