ИМ
Жел. 18, 2018, 9:29 Т.Қ.

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

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

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

6
Evgenii Legotckoi
  • Жел. 19, 2018, 12:04 Т.Ж.
  • (өңделген)
  • Жауап шешім ретінде белгіленді.

Добрый день!

По-моему в вашем случае нужно добавить второй внешний ключ на 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)
    ИМ
    • Жел. 19, 2018, 12:44 Т.Ж.

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

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

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

      Evgenii Legotckoi
      • Жел. 19, 2018, 1:23 Т.Ж.

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

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

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

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

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

      1. movie_object.type = 'M'
      2. 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 как таковой вовсе не нужен.

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

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

            ИМ
            • Жел. 19, 2018, 5:31 Т.Қ.

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

              Пікірлер

              Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
              Кіріңіз немесе Тіркеліңіз