Форум сайта python.su
Утро\день\вечер добрый.
Подскажите пожалуйста, как правильно в моем случае построить БД (в контексте Django)? Хочу учиться правильным вещам с первых шагов, чтоб потом не переделывать и не переучиваться.
Есть парсер, который тянет из разных источников <сеансы фильмов в кинотеатрах> и <описания фильмов> и соответственно формирует 2 файла (временно). Сейчас нахожусь на стадии формирования модели в Джанго.
### Инфо для данного блока берется из одного файла <сеансы фильмов в кинотеатрах> и соответственно данные легко разложить по переменным class Cinemas(models.Model): cinema_city cinema_name cinema_street cinema_phone class MoviesTimetable(models.Model): cinema = models.ForeignKey(Cinemas) movie_name movie_dates movie_times ### Инфо для данного блока берется из файла <описания фильмов> class MoviesDetails(models.Model): movie_name movie_length movie_genre movie_description
Отредактировано TitanFighter (Авг. 14, 2015 01:50:00)
Офлайн
Как-то так:
class Cinema(models.Model): city name street phone class Movie(models.Model): name length genre description class MoviesTimetable(models.Model): cinema = models.ForeignKey(Cinemas) movie = models.ForeignKey(Movie) dates times
Офлайн
PooH1) Разве MoviesTimetable еще не является самым простым вариантом? Или раскладывать еще на Даты? 1ое августа, 2ое августа и тд?)
хотя сдается мне MoviesTimetable должен еще быть разложен на таблицы, но не зная постановки задачи не подскажу
"Ивано-Франковск": { "Линия кино Космос": { "address": "улица Независимости, 97", "phone_number": " 0342503055, 0342502625", "films": { "film_times": [ "10:00" ], "film_dates": "19 августа, среда", "film_name": "Пиксели", } } -------------------------------- { "Пиксели": { "details": { "films_genre": [ "фантастика, комедия" ], "films_length": [ "106 мин" ], "films_description": [ "Пришельцы из космоса по ошибке трактуют тематику космических компьютерных игр как объявление им войны и атакуют Землю, используя видеоигры 80-х в качестве моделей для разнообразных стратегий вторжения. Президент страны обращается за помощью к другу детства, чемпиону тех лет по игре в автоматы Сэму Бреннеру. Тот собирает команду игроков, специалистов по аркадам, чтобы сообща одолеть пришельцев и спасти планету." ], }, },
Отредактировано TitanFighter (Авг. 14, 2015 12:15:11)
Офлайн
TitanFighterПока не надо. Для начала пойдет, надо смотреть по задаче, не существует единственно верного разложения.
1) Разве MoviesTimetable еще не является самым простым вариантом? Или раскладывать еще на Даты? 1ое августа, 2ое августа и тд?)
TitanFighter
2) Из MoviesTimetable вы убрали Name.
class Movie и class MoviesTimetable наполняются из двух разных файлов, где к примеру Терминатор из MoviesTimetable совершенно ничего не знает о своем описании в Movie.
TitanFighter
Если бы данные заливались из 1го файла, где уже имеется связь, эта связь (расписание-описание) бы переносилась в БД, а так между двумя файлами нету никакой связи.
#пусть у вас movie_name имя фильма из файла расписаний try: movie = Movie.objects.get(name=movie_name) except Movie.DoesNotExists: movie = Movie(name=movie_name) #если не нашли с таким названием - создаем #также ищете и Cinema #потом создаете объект timetable и назначаете ему Movie и Cinema timetable = MoviesTimetable(movie=movie, cinema=cinema, бла-бла-бла) timetable.save()
Офлайн
Узнал, чтоб не делать проверку через try except, можно воспользоваться objects.get_or_create
Офлайн
Pooh, в продолжении темы, уделите пожалуйста пару минут.
Я создал модель, как вы и предложили, все работает. Но сейчас пришло время расширять функциональность и начал знакомиться со связью многие-ко-многим и ковырять гугл, хабру и документацию Джанго на эту тему.
Насколько я могу понять, связь кинотеатры-фильмы как раз относиться к типу связей в БД многие-ко-многим = в одном кинотеатре может быть показаны разные фильмы и эти фильмы могут быть показаны в других кинотеатрах. Связь многие-ко-многим подразумевает создание промежуточной (третьей) таблицы и как я понимаю, в примере выше вы это реализовали в MoviesTimetable, только используя ForeignKey вместо ManyToMany с элементом through
Собственно вопрос: Почему вы предложили построить связи через ForeignKey из, по сути, “промежуточной” (третьей) таблицы, а не через ManyToMany? Не исключаю, что я что-то не понимаю или чего-то не вижу и прошу мне объяснить, что не так
По примеру документации Джанго, накатал такой образец с применением ManyToMany и through
class Cinema(models.Model): movie = models.ManyToManyField(Movie, through='MoviesTimetable') city name street phone class Movie(models.Model): name length genre description class MoviesTimetable(models.Model): movie = models.ForeignKey(Movie) cinema = models.ForeignKey(Cinemas) dates times
Отредактировано TitanFighter (Сен. 12, 2015 02:31:55)
Офлайн
TitanFighter
Как я понимаю, ManyToMany в чистом виде используется в простой связке кинотеатры-фильмы.
Отредактировано PooH (Сен. 12, 2015 08:44:35)
Офлайн
PooH
Прошу уделить мне еще немного времени.
1) До меня дошло, что вы имели в виду говоря
PooHЯ добавил 2 класса, так как дата и время многократно повторяются, а нужно двигаться в сторону нормализации:
хотя сдается мне MoviesTimetable должен еще быть разложен на таблицы, но не зная постановки задачи не подскажу
class Dates(models.Model): dates = models.DateField('Date') class Times(models.Model): times = models.TimeField('Time')
class Cinema(models.Model): movie = models.ManyToManyField(Movie, through='MoviesTimetable') city name street phone class Movie(models.Model): name length genre description class MoviesTimetable(models.Model): movie = models.ForeignKey(Movie) cinema = models.ForeignKey(Cinemas) # Добавил ForeignKey в dates и times dates = models.ForeignKey(Dates) times = models.ForeignKey(Times)
Отредактировано TitanFighter (Сен. 23, 2015 19:25:11)
Офлайн
Зачем дату и время выносить в отдельную сущность ?
Офлайн
TitanFighter
1) До меня дошло, что вы имели в виду говоряPooHЯ добавил 2 класса, так как дата и время многократно повторяются, а нужно двигаться в сторону нормализации:
хотя сдается мне MoviesTimetable должен еще быть разложен на таблицы, но не зная постановки задачи не подскажу
class MoviesTimetable(models.Model): movie = models.ForeignKey(Movie) cinema = models.ForeignKey(Cinemas) datetime = models.DateTimeField()
Офлайн