Я наконец выпустил свой проект на производственный уровень, и внезапно у меня возникли проблемы, с которыми мне никогда не приходилось сталкиваться на этапе разработки.
Когда пользователи публикуют какие-то действия, я иногда получаю следующую ошибку.
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "home/ubuntu/server/opineer/comments/views.py", line 103, in comment_expand
comment = Comment.objects.get(pk=comment_id)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 131, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 366, in get
% self.model._meta.object_name)
DoesNotExist: Comment matching query does not exist
Что меня действительно расстраивает, так это то, что проект отлично работает в локальной среде и, кроме того, соответствующий объект запроса ДЕЙСТВИТЕЛЬНО существует в базе данных.
Теперь я подозреваю, что пользователь получает доступ к базе данных, когда она зарезервирована для других пользователей, но нет способа доказать мой аргумент, и у меня нет никакого решения для него.
У кого-нибудь раньше была такая проблема? Есть предложения по решению этой проблемы?
Заранее большое спасибо за вашу помощь.
РЕДАКТИРОВАТЬ: я вручную запросил базу данных, используя ту же информацию, что и полученное мной сообщение об ошибке сервера. Я смог попасть в запись без каких-либо проблем. Более того, похоже, что точно такое же поведение, которое совершил пользователь, большую часть времени не вызывает никаких проблем, а скорее в некоторых (что пока неизвестно) случаях. В заключение, это определенно не проблема с отсутствующей записью в базе данных.
источник
comment = Comment.objects.get(pk=comment_id)
убедитесь, что идентификатор существует в базе данныхОтветы:
ваша строка, вызывающая ошибку, находится здесь:
comment = Comment.objects.get(pk=comment_id)
вы пытаетесь получить доступ к несуществующему комментарию.
from django.shortcuts import get_object_or_404 comment = get_object_or_404(Comment, pk=comment_id)
Вместо того, чтобы иметь ошибку на вашем сервере, ваш пользователь получит 404, что означает, что он пытается получить доступ к несуществующему ресурсу.
Хорошо, я полагаю, вы знаете об этом.
Некоторые пользователи (и я их часть) позволяют вкладкам работать долгое время, если пользователям разрешено удалять данные, это может произойти. Ошибка 404 может быть лучшей ошибкой для обработки ошибки удаленного ресурса, чем отправка электронного письма администратору.
Другие пользователи переходят по адресам из своей истории (то же самое, если данные были удалены, поскольку это может произойти).
источник
from django.db import connection
,connection.connection.close()
,connection.connection = None
чтобы попытаться сбросить дб соединение и начать с новой.Возможно, у вас нет записи Комментариев с таким первичным ключом, тогда вам следует использовать этот код:
try: comment = Comment.objects.get(pk=comment_id) except Comment.DoesNotExist: comment = None
источник
def previous_job(self): return self.get_previous_by_start_dt(brand=self.brand, status='finished') or None
не знаю, как реализовать здесь try catchВы можете использовать это:
comment = Comment.objects.filter(pk=comment_id)
источник
Model.objects.filter
вернет Queryset, тогда какModel.objects.get
вернет объект. Если объект не существует, первый вернет пустой запрос, второй вызоветModel.DoesNotExist
ошибку.Comment.objects.filter(pk=comment_id).first()
вернется,None
если записи не найдены.Вы можете попробовать этот способ. просто используйте функцию, чтобы получить свой объект
def get_object(self, id): try: return Comment.objects.get(pk=id) except Comment.DoesNotExist: return False
источник