创建对象时出现“匹配查询不存在”

0 投票
1 回答
36 浏览
提问于 2025-04-14 15:48

我有:

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 信号。

撰写回答