创建对象时出现“匹配查询不存在”
我有:
class GoogleSignIn(APIView):
def post(self, request):
settings = request.settings
code = request.data['code']
# Verify the OAuth code with Google
try:
google_user_info = verify_user(code)
except Exception as e:
print(str(e))
return Response({'error': 'Failed to verify with Google.'})
email = google_user_info['email']
picture = google_user_info['picture']
try:
user = User.objects.get(email=email)
user_info = UserInfo.objects.get(user=user)
except User.DoesNotExist:
first_name = google_user_info['given_name']
user = User.objects.create_user(
email = email,
username = email,
first_name = first_name,
last_name = google_user_info['family_name'],
password=None)
user_info = UserInfo.objects.create(
user = user,
credits = request.settings.INITIAL_CREDITS,
expiry = compute_credits_expiry(
num_days=settings.FREE_CREDITS_EXPIRY_IN_DAYS))
最后一句话(也就是在异常处理器中创建 UserInfo
对象)产生了一个异常:
accounts.models.UserInfo.DoesNotExist: UserInfo matching query does not exist.
这是什么意思呢?
完整的输出内容:
Internal Server Error: /accounts/google-sign-in/
Traceback (most recent call last):
File "/mnt/c/Dropbox/Parnasa/Web/wherewasit/backend/accounts/views.py", line 129, in post
user = User.objects.get(email=email)
File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 435, in get
raise self.model.DoesNotExist(
django.contrib.auth.models.User.DoesNotExist: User matching query does not exist.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python3/dist-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 70, in view
return self.dispatch(request, *args, **kwargs)
File "/home/meir/.local/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/home/meir/.local/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/meir/.local/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/home/meir/.local/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/mnt/c/Dropbox/Parnasa/Web/wherewasit/backend/accounts/views.py", line 140, in post
user_info = UserInfo.objects.create(
File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 453, in create
obj.save(force_insert=True, using=self.db)
File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 739, in save
self.save_base(using=using, force_insert=force_insert,
File "/usr/lib/python3/dist-packages/django/db/models/base.py", line 763, in save_base
pre_save.send(
File "/usr/lib/python3/dist-packages/django/dispatch/dispatcher.py", line 180, in send
return [
File "/usr/lib/python3/dist-packages/django/dispatch/dispatcher.py", line 181, in <listcomp>
(receiver, receiver(signal=self, sender=sender, **named))
File "/mnt/c/Dropbox/Parnasa/Web/wherewasit/backend/accounts/views.py", line 220, in your_model_pre_save
old = UserInfo.objects.get(id=instance.id)
File "/usr/lib/python3/dist-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/usr/lib/python3/dist-packages/django/db/models/query.py", line 435, in get
raise self.model.DoesNotExist(
accounts.models.UserInfo.DoesNotExist: UserInfo matching query does not exist.
1 个回答
1
我来做一些假设,这里问题的关键在于 pre_save
信号,具体在这行代码
old = UserInfo.objects.get(id=instance.id)
你在尝试在对象创建之前去获取它,上面的代码是这样执行的
old = UserInfo.objects.get(id=None)
要记住,pre_save
信号是在 model.save()
方法之前执行的,
可以考虑使用 post_save
信号。