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)
Вернуться на верх