Я создаю объект «Показать» со многими атрибутами. Один из его атрибутов - это «категории», то есть поле «многие ко многим», связанное с другим объектом «Категории».
Перед тем, как создать «Показать» (взяв данные из переданного объекта), я создаю категории, для которых будет назначено это шоу, например:
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, не всегда одно и то же. Есть ли эффективный метод очистки этих данных каждый раз? Или есть другая проблема.