首页 > 解决方案 > 模型在 django 的视图中变成了元组。怎么回事!他妈的?

问题描述

我正在尝试将字符串(会话哈希)保存到 django 的模型中,但是出了点问题。当我尝试更新字符串时,模型变成了导致 AttributeError 的元组。

一开始,一切都在一个“帖子”功能中,但仍然无法正常工作。我试图将这些东西分成函数,但它仍然没有帮助。在分配类型(会话)说“会话”是一个模型,而不是元组之前。

查看功能代码:

def post(self, request, *args, **kwargs):
    data = json.loads(request.body.decode('utf-8'))
    form = self.form_class(data)
    if form.is_valid():
        phone = form.cleaned_data.get('phone')
        code = form.cleaned_data.get('code')
        password = form.cleaned_data.get('password')

        session = Session.objects.get_or_create(phone=phone, user=request.user.telegramuser)

        if code and password:
            return utils.sign_in(session, phone, code, password)
        elif code:
            return utils.sign_in(session, phone, code)
        elif phone:
            return utils.send_code_request(session, phone)


    return JsonResponse({'state': 'none'})

utils.send_code_request 和 sign_in 具有相同的结构

def send_code_request(session, phone):
    result = asyncio.run(_send_code_request(phone))
    # result - {
    #     'state': 'ok',
    #     'session': 'Hfkdi...AaF24s'
    # }

    if result['state'] == 'ok':
        session.update_session(result.pop('session'))
    return JsonResponse(result)

经理

class DefaultManager(models.Manager):
    def get_or_create(self, *args, **kwargs):
        try:
            return self.get(*args, **kwargs)
        except ObjectDoesNotExist:
            return self.create(*args, **kwargs)

错误:

Internal Server Error: /sessions/add/
Traceback (most recent call last):
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\.env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\.env\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\.env\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\.env\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\.env\lib\site-packages\django\contrib\auth\mixins.py", line 52, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\.env\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\sendall\views.py", line 78, in post
    return utils.send_code_request(session, phone)
  File "C:\Users\ipyth\Documents\projects\telegram-sendall\sendall\utils.py", line 46, in send_code_request
    session.update_session(result.pop('session'))
AttributeError: 'tuple' object has no attribute 'update_session'
[23/Jul/2019 23:51:35] "POST /sessions/add/ HTTP/1.1" 500 86600

标签: djangopython-3.x

解决方案


get_or_create确实返回对象和创建标志的元组。要么捕获两者:

session, created = Session.objects.get_or_create(phone=phone...)

或者,create改为使用。

或者更好的是,使用表单保存方法:

session = form.save()

推荐阅读