Ошибка ValueError при назначении отношения m2m после сохранения данных - недопустимый литерал для int () с основанием 10: «Музыка» - PullRequest
0 голосов
/ 17 апреля 2019

Я создаю объект «Показать» со многими атрибутами. Один из его атрибутов - это «категории», то есть поле «многие ко многим», связанное с другим объектом «Категории».

Перед тем, как создать «Показать» (взяв данные из переданного объекта), я создаю категории, для которых будет назначено это шоу, например:

for each_category in parsed_podcast.categories:
        Category.objects.get_or_create(title=each_category,
                                        slug=slugify(each_category),
                                        full=each_category,
                                        )

Приведенный выше код создает объекты в моей модели категории, я могу проверить, что они есть. Как только они появятся, я создам объект Show со множеством атрибутов, которые я удалил, потому что они не имеют отношения:

try:
        podcast_instance = Show.objects.get(title=parsed_podcast.title)
except Show.DoesNotExist:
        podcast_instance = Show(title=parsed_podcast.title,
                    slug=slugify(parsed_podcast.title),
                    image_title=parsed_podcast.image_title,
                    image_url=parsed_podcast.image_url,
                    .....
                    )
       podcast_instance.save()

Все это работает нормально, пока я не попытаюсь присвоить категорию (из parsed_podcast.categories) недавно созданной Категории, созданной на первом шаге, например:

for each_category in parsed_podcast.categories:
            print('The category in the parsed podcast is {}'.format(each_category))
            podcast_instance.categories.add(each_category)

Я никогда не могу назначить категорию - она ​​всегда остается опцией, когда я проверяю Django Admin на модели. Я хочу назначить его программно, но получаю сообщение об ошибке:

ValueError: invalid literal for int() with base 10: 'Music'

Tracebacks:

Traceback (most recent call last):
  File "podcasts.py", line 211, in <module>
    podcast_s()
  File "populate.py", line 205, in podcast_scrape
    submit(parsed_podcast,podcast_rss)
  File "populate.py", line 118, in submit2
    podcast_instance.categories.add(each_category)

  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 926, in add
    self._add_items(self.source_field_name, self.target_field_name, *objs)
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 1073, in _add_items
    '%s__in' % target_field_name: new_ids,
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 844, in filter
    return self._filter_or_exclude(False, *args, **kwargs)
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\query.py", line 862, in _filter_or_exclude
    clone.query.add_q(Q(*args, **kwargs))
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1263, in add_q
    clause, _ = self._add_q(q_object, self.used_aliases)
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1287, in _add_q
    split_subq=split_subq,
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1225, in build_filter
    condition = self.build_lookup(lookups, col, value)
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\sql\query.py", line 1096, in build_lookup
    lookup = lookup_class(lhs, rhs)
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\lookups.py", line 20, in __init__
    self.rhs = self.get_prep_lookup()
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related_lookups.py", line 59, in get_prep_lookup
    self.rhs = [target_field.get_prep_value(v) for v in self.rhs]
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\related_lookups.py", line 59, in <listcomp>
    self.rhs = [target_field.get_prep_value(v) for v in self.rhs]
  File "C:\Users\p\Anaconda3\envs\myDjangoEnv\lib\site-packages\django\db\models\fields\__init__.py", line 965, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'Music'

У меня такое ощущение, что то, что в моих parsed_podcast.categories, не всегда одно и то же. Есть ли эффективный метод очистки этих данных каждый раз? Или есть другая проблема.

1 Ответ

2 голосов
/ 17 апреля 2019

Проблема в том, что вы пытаетесь передать строку, которую вы проанализировали, когда вам нужно либо передать объект pk или category.

Когда вы создаете categories,использовать созданный объект.

for each_category in parsed_podcast.categories:
       category, created = Category.objects.get_or_create(title=each_category,
                                        slug=slugify(each_category),
                                        full=each_category,
                                        )
       print('The category in the parsed podcast is {}'.format(each_category))
       podcast_instance.categories.add(category)
...