ИМ
Dec. 18, 2018, 9:29 p.m.

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

django, model

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

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

  1. class Movie(models.Model):
  2. class Meta:
  3. db_table = 'movie'
  4. verbose_name = 'Фильм'
  5. verbose_name_plural = 'Фильмы'
  6.  
  7. name = models.CharField(verbose_name='Название', max_length=200)
  8. orig_name = models.CharField(verbose_name='Оригинальное название', max_length=200, blank=True)
  9. poster = models.ImageField(
  10. # upload_to=curry(upload_to_media, prefix='posters'),
  11. upload_to=upload_to_media,
  12. blank=True,
  13. verbose_name='Постер'
  14. )
  15. compilation = models.ForeignKey(Compilation, on_delete=models.CASCADE, verbose_name='Подборки')
  16. year = models.DateField(verbose_name='Дата выхода', default='2000-01-01')
  17. country = models.CharField(verbose_name='Страна', max_length=300, default='Неизвестно')
  18. translate = models.CharField(verbose_name='Перевод', max_length=300, default='Русский')
  19. date = models.DateTimeField(verbose_name='Дата публикации')
  20. description = models.TextField(verbose_name='Описание')
  21. moder = models.BooleanField(verbose_name='Модерация', default=False)
  22. video = models.FileField(
  23. # upload_to=curry(upload_to_media, prefix='movies'),
  24. upload_to=upload_to_media,
  25. verbose_name='Видео'
  26. )
  27. votes = GenericRelation(LikeDislike, related_query_name='movies')

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

2

Do you like it? Share on social networks!

6
Evgenii Legotckoi
  • Dec. 19, 2018, 12:04 a.m.
  • (edited)
  • The answer was marked as a solution.

Добрый день!

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

  1. class Movie(models.Model):
  2.  
  3. CATEGORY = 'C'
  4. COMPILATION = 'M'
  5. MOVIE_TYPE_CHOICES = (
  6. (CATEGORY, 'Категории'),
  7. (COMPILATION, 'Подборки'),
  8. )
  9. type = models.CharField(
  10. 'Тип',
  11. max_length=1,
  12. choices=MOVIE_TYPE_CHOICES,
  13. default=CATEGORY
  14. )
  15. category = models.ForeignKey(Category, on_delete=models.CASCADE, verbose_name='Категории', null=True)
  16. compilation = models.ForeignKey(Compilation, on_delete=models.CASCADE, verbose_name='Подборки', null=True)

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

    1. CATEGORY = 'C'
    2. COMPILATION = 'M'

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

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

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

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

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

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

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

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

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

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

        ИМ
        • Dec. 19, 2018, 1:42 a.m.
        • (edited)

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

        По полю playlist:

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

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

          Evgenii Legotckoi
          • Dec. 19, 2018, 1:58 a.m.

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

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

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

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

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

              Comments

              Only authorized users can post comments.
              Please, Log in or Sign up
              • Last comments
              • AK
                April 1, 2025, 11:41 a.m.
                Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
              • Evgenii Legotckoi
                March 9, 2025, 9:02 p.m.
                К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
              • VP
                March 9, 2025, 4:14 p.m.
                Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
              • ИМ
                Nov. 22, 2024, 9:51 p.m.
                Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
              • Evgenii Legotckoi
                Oct. 31, 2024, 11:37 p.m.
                Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup