Django / Python - изменение не сохраняется в базе данных - AttributeError: 'QuerySet' object has no attribute 'reload'
У меня есть настройка, которую пользователь может изменить: отправлять электронную почту автоматически или вручную. Для этого я создал базу данных только с 1 строкой, которая имеет следующие столбцы:
class AutoSendMail(models.Model):
auto = models.BooleanField(default=False)
manual = models.BooleanField(default=True)
send_type = (
('manual', 'MANUAL'),
('auto', 'AUTO')
)
type = models.CharField(max_length=6, choices=send_type, default="manual")
def get(self):
new_self = self.__class__.objects.get(pk=self.pk)
# You may want to clear out the old dict first or perform a selective merge
self.__dict__.update(new_self.__dict__)
return reverse("core:autosend", kwargs={"auto": self.auto})
def reload(self):
new_self = self.__class__.objects.get(pk=self.pk)
# You may want to clear out the old dict first or perform a selective merge
self.__dict__.update(new_self.__dict__)
В этом случае либо 'auto', либо 'manual' - True, а другое - False. Тип" устанавливается в 'auto' или 'manual' соответственно. Эта настройка используется в остальной части кода. Код, который я имею сейчас в своем представлении, выглядит так:
class AutoSendView(generic.TemplateView):
template_name = 'core/mailbox/autoSendMail.html'
context_object_name = 'autosend'
extra_context = {"mailbox_page": "active"}
model = AutoSendMail.objects.get(id=1)
model.refresh_from_db()
autoSetting = int(model.auto == True)
manualSetting = int(model.manual == True)
def post(self, request, *args, **kwargs):
id_ = self.kwargs.get("pk")
update_type = self.request.POST.get('update_type')
if update_type == 'manual':
logger.info("Set to: manual email send")
model = AutoSendMail.objects.filter(id=1)
model.manual = True
model.auto = False
model.type = "manual"
for object in model:
object.save()
model.reload()
return redirect("core:autosend")
elif update_type == 'auto':
logger.info("Set to: auto email send")
model = AutoSendMail.objects.filter(id=1)
model.manual = False
model.auto = True
model.type = "auto"
for object in model:
object.save()
model.reload()
return redirect("core:autosend")
Моя проблема в том, что то, что пользователь меняет в настройках, не сохраняется в базе данных (sqlite3). И я не уверен, почему нет. Потому что когда я пробую это в моей консоли python, это работает. Значит, я делаю что-то неправильно.
При использовании приведенного выше кода я получаю ошибку, говорящую:
ERROR Internal Server Error: /mailbox/autosend
Traceback (most recent call last):
File "C:\Users\Portal\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Users\Portal\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\Portal\venv\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "C:\Users\Portal\venv\lib\site-packages\django\views\generic\base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "C:\Users\Portal\venv\lib\site-packages\django\views\generic\base.py", line 101, in dispatch
return handler(request, *args, **kwargs)
File "C:\Users\portal\core\views.py", line 200, in post
model.reload()
AttributeError: 'QuerySet' object has no attribute 'reload'
ERROR "POST /mailbox/autosend HTTP/1.1" 500 2657
У кого-нибудь есть идея, как с этим справиться? Когда я удаляю 'reload', он выдает ошибку 'Объект QuerySet' не имеет атрибута 'save'. Если я также удалю 'save()', это не сохранит изменения
filter(...) вернет Queryset, но get(...) вернет объект. Поэтому замените:
model = AutoSendMail.objects.filter(id=1)
с
model = AutoSendMail.objects.get(id=1)
Альтернатива
Я думаю, что ваши коды очень избыточны и неоптимизированы. Я думаю, вы можете использовать следующий код:
if update_type == 'auto':
model = AutoSendMail.objects.filter(id=1).update(type="auto", auto=True)