Форум сайта python.su
Добрый день.
Кратко о проблеме:
Имеются циклы, которые раскидывают информацию по БД. Видно из “принт-логов” ниже. При первом проходе все создается нормально. При втором проходе создается второй инстанс (тот же фильм, только жанр изменен), но данный код
show_movie.showsMovie_originCountry.get_or_create(placeCountry_name=country)
django.db.utils.IntegrityError: duplicate key value violates unique constraint "place_countries_placeCountry_name_key" DETAIL: Key ("placeCountry_name")=(Польша) already exists.
# Первый проход\инстанс DEBUG -> show_movie: id: 42 ---->>>> Добрый день, я люблю тебя! ---->>>> Мелодрама DEBUG -> country: Польша DEBUG -> films_cast: Алексей Коморовский, Барбара Курдей, Павел Домагала DEBUG -> actor_position: (<ShowPersonsInShows: Актер>, False) DEBUG -> actor_position: (<ShowPersonsInShows: Актер>, False) DEBUG -> actor_position: (<ShowPersonsInShows: Актер>, False) DEBUG -> films_producer: Рышард Заторский DEBUG -> producer_position: (<ShowPersonsInShows: Режиссер>, False) DEBUG -> films_scenarist: Рышард Заторский DEBUG -> scenarist_position: (<ShowPersonsInShows: Сценарист>, False) # Второй проход\инстанс DEBUG -> show_movie: id: 43 ---->>>> Добрый день, я люблю тебя! ---->>>> Комедия DEBUG -> country: Польша Traceback (most recent call last): #### django.db.utils.IntegrityError: duplicate key value violates unique constraint "place_countries_placeCountry_name_key" DETAIL: Key ("placeCountry_name")=(Польша) already exists.
class Shows(models.Model): show_name = models.CharField(max_length=100, db_index=True) show_poster = models.ImageField('Poster') show_screen = models.ImageField('Screens') show_genre = models.CharField('Genre', max_length=20, blank=True) # show_length = models.IntegerField('Length', null=True) show_length = models.TimeField('Time', null=True) show_ageLimit = models.IntegerField('Age limit', null=True) show_description = models.TextField('Description', blank=True) show_youtubeUrl = models.URLField('Youtube', max_length=255, blank=True) show_person = models.ManyToManyField(ShowPersons, through='ShowPersonsInShows', related_name='%(app_label)s_%(class)s_related', verbose_name="People in movie") class Meta: db_table = 'shows' verbose_name = 'Show' verbose_name_plural = 'Shows' ordering = ['show_name'] class ShowsMovies(Shows): showsMovie_originalName = models.CharField('Original name', max_length=100, blank=True) showsMovie_budget = models.IntegerField('Budget', null=True) showsMovie_productionYear = models.IntegerField('Production year', null=True) showsMovie_officialSite = models.URLField('Official site', max_length=255, blank=True) showsMovie_originCountry = models.ManyToManyField('app_places.PlaceCountries', verbose_name='Origin country', db_table='m2m_shows_movies_to_place_countries') class Meta: db_table = 'shows_movies' verbose_name = 'Show Type - Movie' verbose_name_plural = 'Show Type - Movie'
class PlaceCountries(models.Model): placeCountry_name = models.CharField("Country's Name", max_length=60, unique=True) placeCountry_short_name = models.CharField("Country's Short name", max_length=5, unique=True) class Meta: db_table = 'place_countries' verbose_name = 'Country' verbose_name_plural = 'Countries' ordering = ['placeCountry_name']
for genre in films_genre.title().split(', '): show_movie, created = ShowsMovies.objects.get_or_create( show_name=film, show_genre=genre, show_length=films_length, show_ageLimit=films_age, show_description=films_description, show_youtubeUrl=films_youtube_url, showsMovie_originalName=films_original_name, showsMovie_productionYear=films_year, ) print('DEBUG -> show_movie:', 'id:', show_movie.id, '---->>>>', show_movie.show_name, '---->>>>', show_movie.show_genre) for country in films_country.split(', '): print('DEBUG -> country:', country) # Место возникновения ошибки show_movie.showsMovie_originCountry.get_or_create(placeCountry_name=country) if films_cast != ' ': print('DEBUG -> films_cast:', films_cast) for actor in films_cast.split(', '): # и таких еще 2 цилка, только для продюсера и сценариста get_showPersonsInShow_person, created = ShowPersons.objects.get_or_create(showPerson_fullname=actor) get_showPersonsInShow_show, created = Shows.objects.get_or_create(show_name=film, show_genre=genre) actor_position = ShowPersonsInShows.objects.get_or_create( showPersonsInShow_person=get_showPersonsInShow_person, showPersonsInShow_show=get_showPersonsInShow_show, showPersonsInShow_position='Актер' ) print('DEBUG -> actor_position:', actor_position)
Traceback (most recent call last): File "<console>", line 1, in <module> File "/home/antonio/projects/idemvdvoem.com/idemvdvoem.com/src/shared/parser.py", line 47, in __init__ self.films_list() File "/home/antonio/projects/idemvdvoem.com/idemvdvoem.com/src/shared/parser.py", line 91, in films_list self.detailed_films_info(films_dict) File "/home/antonio/projects/idemvdvoem.com/idemvdvoem.com/src/shared/parser.py", line 285, in detailed_films_info show_movie.showsMovie_originCountry.get_or_create(placeCountry_name=country) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/fields/related.py", line 1029, in get_or_create obj, created = super(ManyRelatedManager, self.db_manager(db)).get_or_create(**kwargs) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/query.py", line 407, in get_or_create return self._create_object_from_params(lookup, params) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/query.py", line 447, in _create_object_from_params six.reraise(*exc_info) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/utils/six.py", line 659, in reraise raise value File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/query.py", line 439, in _create_object_from_params obj = self.create(**params) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/query.py", line 348, in create obj.save(force_insert=True, using=self.db) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/base.py", line 734, in save force_update=force_update, update_fields=update_fields) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/base.py", line 762, in save_base updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/base.py", line 846, in _save_table result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/base.py", line 885, in _do_insert using=using, raw=raw) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/manager.py", line 127, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/query.py", line 920, in _insert return query.get_compiler(using=using).execute_sql(return_id) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/models/sql/compiler.py", line 974, in execute_sql cursor.execute(sql, params) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/backends/utils.py", line 79, in execute return super(CursorDebugWrapper, self).execute(sql, params) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/utils.py", line 97, in __exit__ six.reraise(dj_exc_type, dj_exc_value, traceback) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/utils/six.py", line 658, in reraise raise value.with_traceback(tb) File "/home/antonio/projects/idemvdvoem.com/lib/python3.4/site-packages/django/db/backends/utils.py", line 64, in execute return self.cursor.execute(sql, params) django.db.utils.IntegrityError: duplicate key value violates unique constraint "place_countries_placeCountry_name_key" DETAIL: Key ("placeCountry_name")=(Польша) already exists.
Отредактировано TitanFighter (Окт. 3, 2015 17:42:57)
Офлайн