Django Postgresql Error in Production (quiz.models.Question.DoesNotExist:)
Я создаю приложение для викторины, используя руководство. Мое приложение прекрасно работает в разработке с базами данных sqlite3 и postgresql. Но при переносе в продакшн я сталкиваюсь с ошибками при использовании базы данных postgresql. Поэтому я попробовал использовать мою базу данных sqlite3 из разработки в production для проверки. Моя база данных sqlite3 прекрасно работает в production, но postgresql не работает в production. Первоначально я думал, что ошибка на уровне представлений, но теперь я вижу, что ошибка исходит от postgresql. Возможно, это ошибки в моих представлениях или схемах моделей. Я действительно не могу сказать. Соответствующая ошибка, которую я получаю при использовании базы данных postgresql в производстве, используя сервер linux с gunicorn и nginx, находится здесь ниже, а весь дизайн модели и представления также находятся здесь ниже. Спасибо, я ценю ваше время, потраченное на то, чтобы дать мне подходящий ответ на мой вопрос.
models.py
views.py
def save_quiz_view(request, pk, book_pk):
# if request.user in
quiz = Quiz.objects.get(pk=pk)
# Submition of result only occurs if a user is not in the completed users field. If they are already
# in the completed users ManyToMany field, then it won't save. But if not, it will save.
if request.is_ajax() and not request.user.profile in quiz.completed_users.all():
questions = []
data = request.POST
data_ = dict(data.lists())
data_.pop('csrfmiddlewaretoken')
for _k in data_.keys():
if Question.objects.all():
# print('key: ', k)
k = _k
question = Question.objects.get(text=k)
questions.append(question)
user = request.user.profile
quiz = Quiz.objects.get(pk=pk)
if request.user.is_authenticated:
if not user in quiz.completed_users.all():
quiz.completed_users.add(user)
score = 0
multiplier = 100 / quiz.number_of_questions
results = []
correct_answer = None
for q in questions:
a_selected = request.POST.get(q.text)
if a_selected != "":
question_answers = Answer.objects.filter(question=q)
for a in question_answers:
if a_selected == a.text:
if a.correct:
score += 1
correct_answer = a.text
else:
if a.correct:
correct_answer = a.text
results.append({str(q): {'correct_answer': correct_answer, 'answered': a_selected}})
else:
results.append({str(q): 'not answered'})
score_ = score #* multiplier
Result.objects.create(quiz=quiz, user=user, score=score_)
if score_:#>= quiz.required_score_to_pass:
return JsonResponse({'passed': True, 'score': score_, 'results': results})
else:
return JsonResponse({'passed': False, 'score': score_, 'results': results})
Ошибка
django@UniqueAsf2:~/src$ python3 manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
October 26, 2021 - 03:57:12
Django version 3.2.8, using settings 'asf.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
[26/Oct/2021 03:57:18] "GET /quiz/1/1/ HTTP/1.1" 200 8065
Not Found: /quiz/1/1/assets/vendors/boxicons/css/boxicons.min.css
[26/Oct/2021 03:57:18] "GET /quiz/1/1/assets/vendors/boxicons/css/boxicons.min.css HTTP/1.1" 404 5612
[26/Oct/2021 03:57:18] "GET /quiz/1/1/data/ HTTP/1.1" 200 101
Internal Server Error: /quiz/1/1/save/
Traceback (most recent call last):
File "/home/django/.local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/django/.local/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/django/src/quiz/views.py", line 108, in save_quiz_view
question = Question.objects.get(text=_k)
File "/home/django/.local/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/django/.local/lib/python3.9/site-packages/django/db/models/query.py", line 435, in get
raise self.model.DoesNotExist(
quiz.models.Question.DoesNotExist: Question matching query does not exist.
Ваши данные в Question
не хранятся в виде простого текста, потому что вы используете RichTextUploadingField
, который преобразует текст в формат HTML для работы с текстовым фоматом. Из-за этого вы не можете напрямую сравнить две строки или выполнить поиск по ним.
Попробуйте использовать icontains для проверки строки в вашем поле. Это может сработать не во всех случаях, поэтому вам придется действовать соответствующим образом.
questions = Question.objects.filter(text__icontains=k)
for question in questions:
# Handle questions here