Целый вечер уже бьюсь над ошибкой. Помогите пожалуйста
Парсю данные и заливаю их в БД.
### часть кода из 1го метода, который завершается формированием словаря basic_dict[self.country][city.text.lstrip()][name] = dict(detailed_url=detailed_url, place_type = self.place_type) ### тут 2ой метод, который завершается расширением первого словаря extended_dict[self.country][city][cinema].update(dict(address = street1, phone_number = phone1, official_website = website1)) self.showtime(extended_dict) ### тут 3ий метод, который принимает расширенный словарь и начинает уже парсить данные и заливать в БД. def showtime(self, extended_dict): showtime_dict = extended_dict for city in showtime_dict[self.country]: for cinema in showtime_dict[self.country][city]: url = showtime_dict[self.country][city][cinema]['detailed_url'] showtimes_tab_url = '/showtimes/#!=&cinema-section=%2Fshowtimes%2F' tree = prepare_content(url + showtimes_tab_url) for film in tree.xpath('//div[@class="content"]'): film_name = film.xpath('.//a[@class="navi"]/text()')[0] for date in film.xpath('.//li[contains(@class,"showtimes-day sdt")]'): film_date = date.xpath('.//div[@class="date"]/text()')[0] for time in date.xpath('.//ul[@class="showtimes-day-block"]/li'): film_time = time.xpath('string(a/text())') film_buy_ticket_url = time.xpath('string(a/@href)') if len(film_time) == 0: film_time = None is_3d = time.find('span') film_format = '' if film_time is not None: if is_3d is not None: film_format = '3D' else: film_format = '2D' # IMPORT from app_places.models import Place from app_shows_and_times.models import Show, Showtime get_showtime_place = Place.objects.get(place_name = cinema, place_street = showtime_dict[self.country][city][cinema]['address']) get_showtime_show = Show.objects.get(show_name = film_name) showtime = Showtime.objects.create( showtime_dates = film_date, showtime_times = film_time, showtime_format = film_format, showtime_buy_ticket_url = film_buy_ticket_url, showtime_place = get_showtime_place, showtime_show = get_showtime_show)
Часть модели (и так уже кода много), где можно увидеть, что 2 поля идут как уникальные.
class Place(models.Model): place_name = models.CharField(max_length = 50, db_index = True) place_street = models.CharField(max_length = 80) place_phone = models.CharField(max_length = 60) place_official_site = models.URLField(max_length = 255, blank = True) place_country = models.ForeignKey(Country) place_city = models.ForeignKey(City) place_type = models.ForeignKey(PlaceType) class Meta: db_table = 'place' unique_together = (('place_name', 'place_street'))
Проблема. Запускаю класс, пошел импорт, который заканчивается KeyError: ‘address’, при том что 4700 записей в БД уже создано (базу предварительно очищаю), значит, как я понимаю, до какого-то этапа данное выражение:
get_showtime_place = Place.objects.get(place_name = cinema, place_street = showtime_dict)
работает. Но никак не могу понять, откуда возникает сбой.
Соответственно 3 вопроса:
1) Правильно ли я использую unique? Т.е. в модели задал в мета классе, а в objects.get указываю оба эти поля. Так и нужно?
2) Нужно ли для place_street = models.CharField(max_length = 80) делать db_index = True?
3) По какой причине может идти заливка в БД со ссылкой на ‘address’ в словаре, и в итоге выдавать ошибку?
Как одно из предположений, возможно 4700 записи и должно быть, но я тогда не понимаю, почему процесс заканчивается ошибкой.
Простите за кучу кода.
Едит1:
Думал уже, может где-то в базе Place нету записи street. Проверил - улицы везде указаны.