У объекта '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)
Вернуться на верх