У объекта 'QuerySet' нет атрибута 'videos_set'
я пытаюсь получить все видео, связанные с учебной программой, я пробовал curriculum.videos.all
но он возвращает эту ошибку, которая говорит 'QuerySet' object has no attribute 'videos'
, я также пробовал использовать curriculum.videos_set.all
тогда он показывает ту же ошибку, но на этот раз с 'QuerySet' object has no attribute 'videos_set'
. что может быть проблемой с этой проблемой?
models.py
class Course(models.Model):
course_title = models.CharField(max_length=100, null=True, blank=True)
slug = models.SlugField(unique=True)
course_thumbnail = models.ImageField(upload_to=user_directory_path, blank=True)
class Curriculum(models.Model):
course = models.ForeignKey(Course , null = False , on_delete=models.CASCADE, related_name="curriculum")
title = models.CharField(max_length = 100 , null = False)
slug = models.SlugField(unique=True)
def __str__(self):
return f'{self.course.course_title} - {self.title}'
class Video(models.Model):
title = models.CharField(max_length = 100 , null = False)
curriculum = models.ForeignKey(Curriculum , null = False , on_delete=models.CASCADE, related_name="videos")
serial_number = models.IntegerField(null=False)
video_id = models.CharField(max_length = 100 , null = False)
def __str__(self):
return self.title
Теперь вот представление, которое я написал для него View.py
# @login_required
def course_details(request, course_slug):
if request.user.is_authenticated:
user = request.user
course = Course.objects.get(slug=course_slug)
curriculum = Curriculum.objects.filter(course=course)
serial_number = request.GET.get('lecture')
videos = curriculum.videos_set.all().order_by("serial_number")
...
Вы должны использовать менеджер Video
и фильтровать по экземпляру учебной программы.
Попробуйте так:
# @login_required
def course_details(request, course_slug):
if request.user.is_authenticated:
user = request.user
course = Course.objects.get(slug=course_slug)
curriculum = Curriculum.objects.filter(course=course)
serial_number = request.GET.get('lecture')
videos = Video.objects.filter(curriculum=curriculum).order_by('serial_number')
...
Больше информации в официальном документе
Если вы хотите получить все видео, связанные с учебным планом, вам следует сделать следующий запрос filter()
:
# @login_required def course_details(request, course_slug): if request.user.is_authenticated: user = request.user course = Course.objects.get(slug=course_slug) curriculum = Curriculum.objects.filter(course=course) serial_number = request.GET.get('lecture') videos = Video.objects.filter(curriculum=curriculum).order_by('serial_number') ...
.
Note:
Обычно лучше использоватьget_object_or_404
вместоget()
, он автоматически обрабатывает ошибку http 404.
Использовать как:
course = get_object_or_404(Course,slug=course_slug)