Django преобразование isoformat string datetime в кортеж и возникновение ошибки
Я пытаюсь обновить два поля времени даты для сущности Skill в моей базе данных. Я уверен, что передаю изоформатную строку времени. При создании вместо обновления все работает нормально, но при обновлении я получаю:
Exception Type: TypeError
Exception Value: fromisoformat: argument must be str
Вот код, вызывающий ошибку TypeError:
# create or update skill
created = ibm_date_to_iso(clean_data["skill"]["created"])
updated = ibm_date_to_iso(clean_data["skill"]["updated"])
try:
skill = Skill.objects.get(
skill_id=clean_data["skill"]["skill_id"],
snapshot=clean_data["skill"]["snapshot"]
)
# update fields if skills exists already
skill.name = clean_data["skill"]["name"],
skill.type = clean_data["skill"]["type"],
skill.status = clean_data["skill"]["status"],
skill.created = created,
skill.updated = updated,
skill.language = clean_data["skill"]["language"],
skill.description = clean_data["skill"]["description"],
skill.dialog_settings = clean_data["skill"]["dialog_settings"]
skill.uploads.add(u)
except Skill.DoesNotExist:
skill = Skill(
skill_id=clean_data["skill"]["skill_id"],
name=clean_data["skill"]["name"],
type=clean_data["skill"]["type"],
status=clean_data["skill"]["status"],
created=created,
updated=updated,
language=clean_data["skill"]["language"],
snapshot=clean_data["skill"]["snapshot"],
description=clean_data["skill"]["description"],
dialog_settings=clean_data["skill"]["dialog_settings"]
)
skill.save()
skill.uploads.add(u)
# new page for the skill entity
page = Page(
title="notes for Skill {} snap {}".format(
skill.name,
skill.snapshot),
content="This page is empty..."
)
page.save()
skill.save()
Исключение возникает на последней строке (skill.save()) только тогда, когда не возникает исключение DoesNotExist.
Вот модель навыков:
class Skill(models.Model):
skill_id = models.CharField(max_length=36)
name = models.TextField()
type = models.TextField()
status = models.TextField()
created = models.DateTimeField()
updated = models.DateTimeField()
language = models.TextField()
snapshot = models.IntegerField()
description = models.TextField()
dialog_settings = models.TextField()
page = models.ForeignKey(
"Page",
on_delete=models.SET_NULL,
default=None,
null=True,
blank=True)
uploads = models.ManyToManyField(
"upload",
blank=True,
default=None)
class Meta:
constraints = [
models.UniqueConstraint(
fields=["skill_id", "snapshot"],
name="unique_skill_snapshot")
]
При просмотре отладочных данных конечная строка, вызывающая ошибку TypeError, находится в кодовой базе Django:
assistant_doc/python_env/lib/python3.8/site-packages/django/utils/dateparse.py, line 116, in parse_datetime
return datetime.datetime.fromisoformat(value)
…
Local vars
Variable Value
value ('2022-01-21T10:07:32.045000',)
Как вы можете видеть, параметр 'value' был изменен на кортеж, содержащий строку isoformat. Это ошибка в Django?
У меня была такая же проблема. Оказалось, что я поставил запятую в конце оператора присваивания
В вашем коде ошибка находится здесь:
skill.name = clean_data["skill"]["name"], # <-- comma here!
Python создает кортеж, когда в конце переменной стоит запятая.