Django - "get raise self.model.DoesNotExist: Курс, соответствующий запросу, не существует
Я создаю LMS по учебнику, используя Django backend с Vue.js для frontend. При попытке опубликовать комментарий к уроку на сайте я получаю следующий откат.
Traceback (most recent call last):
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/views/generic/base.py", line 69, in view
return self.dispatch(request, *args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/rest_framework/decorators.py", line 50, in handler
return func(*args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/relate_django/course/views.py", line 74, in add_comment
course = Course.objects.get(slug=course_slug)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/Users/markmckeon/Django_Stuff/Relate/environment_3_8_8/lib/python3.8/site-packages/django/db/models/query.py", line 439, in get
raise self.model.DoesNotExist(
course.models.Course.DoesNotExist: Course matching query does not exist.
[23/Dec/2021 12:18:25] "POST /api/v1/courses/undefined/Heat_Transfer_understand/ HTTP/1.1" 500 102326
Я полагаю, что Django выдает эту ошибку из-за того, что Foreignkey используется в модели курса в views.py:
from django.shortcuts import render
from rest_framework import serializers
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.response import Response
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from .models import Course, Lesson, Comment, Category
from .serializers import CourseListSerializer, CourseDetailSerializer, LessonListSerializer, CommentsSerializer, CategorySerializer
@api_view(['GET'])
@authentication_classes([])
@permission_classes([])
def get_course(request, slug):
course = Course.objects.get(slug=slug)
course_serializer = CourseDetailSerializer(course)
lesson_serializer = LessonListSerializer(course.lessons.all(), many=True)
if request.user.is_authenticated:
course_data = course_serializer.data
else:
course_data = {}
data = {
'course': course_data,
'lessons': lesson_serializer.data
}
return Response(data)
@api_view(['GET'])
def get_comments(request, course_slug, lesson_slug):
lesson = Lesson.objects.get(slug=lesson_slug)
serializer = CommentsSerializer(lesson.comments.all(), many=True)
return Response(serializer.data)
@api_view(['POST'])
def add_comment(request, course_slug, lesson_slug):
data = request.data
name = data.get('name')
content = data.get('content')
course = Course.objects.get(slug=course_slug)
lesson = Lesson.objects.get(slug=lesson_slug)
comment = Comment.objects.create(course=course, lesson=lesson, name=name, content=content, created_by=request.user)
serializer = CommentsSerializer(comment)
return Response(serializer.data)
Из-за этой ошибки также не происходит динамического обновления названий курсов в моих уроках. Я исследовал, что Django выбрасывает эти исключения с внешними ключами, когда Django не может генерировать уникальные имена? Любое руководство о том, как я могу реализовать блок try и except для этого, было бы очень полезно.
Вот models.py :
from django.conf import settings
from django.contrib.auth.models import User
from django.db import models
class Category(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField()
short_description = models.TextField(blank=True, null=True)
created_at = models.DateField(auto_now_add=True)
class Meta:
verbose_name_plural = 'Categories'
def __str__(self):
return self.title
class Course(models.Model):
categories = models.ManyToManyField(Category)
title = models.CharField(max_length=255)
slug = models.SlugField()
short_description = models.TextField(blank=True, null=True)
long_description = models.TextField(blank=True, null=True)
created_at = models.DateField(auto_now_add=True)
image = models.ImageField(upload_to='uploads', blank=True, null=True)
def __str__(self):
return self.title
def get_image(self):
if self.image:
return settings.WEBSITE_URL + self.image.url
else:
return 'http://bulma.io/images/placeholders/1280x960.png'
class Lesson(models.Model):
DRAFT = 'draft'
PUBLISHED = 'published'
CHOICES_STATUS = (
(DRAFT, 'Draft'),
(PUBLISHED, 'Published')
)
ARTICLE = 'article'
QUIZ = 'quiz'
CHOICES_LESSON_TYPE = (
(ARTICLE, 'Article'),
(QUIZ, 'Quiz')
)
course = models.ForeignKey(Course, related_name='lessons', on_delete=models.CASCADE)
title = models.CharField(max_length=255)
slug = models.SlugField()
short_description = models.TextField(blank=True, null=True)
long_description = models.TextField(blank=True, null=True)
status = models.CharField(max_length=20, choices=CHOICES_STATUS, default=PUBLISHED)
lesson_type = models.CharField(max_length=20, choices=CHOICES_LESSON_TYPE, default=ARTICLE)
class Comment(models.Model):
course = models.ForeignKey(Course, related_name='comments', on_delete=models.CASCADE)
lesson = models.ForeignKey(Lesson, related_name='comments', on_delete=models.CASCADE)
name = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
created_by = models.ForeignKey(User, related_name='comments', on_delete=models.CASCADE)
Проблема решена.
У меня было user.is_authenticated
условное блокирование словаря course_data в views.py.
Д'о. Много часов потрачено впустую. Но я кое-чему научился!