Django: как использовать метод .filter( ) в django?

Я пытаюсь отобразить тест только для пользователей, которые зарегистрированы в определенном курсе, т.е. если пользователь зарегистрирован в Frontend Crash Course, я хочу, чтобы он видел только quiz, связанные с этим курсом, в котором он зарегистрирован, а не все тесты из базы данных.

У меня есть модель UserCourse, где я храню все курсы, на которые записался пользователь, когда я пытаюсь фильтровать по этой модели user_course, то get выглядит следующим образом

user_course = UserCourse.objects.get(user=request.user)
quizzes = Quiz.objects.filter(course__usercourse=user_course).annotate(questions_count=Count('questions'))

я получаю эту ошибку get() returned more than one UserCourse -- it returned 3! Теперь я изменил .get() на .filter() следующим образом

user_course = UserCourse.objects.filter(user=request.user)
quizzes = Quiz.objects.filter(course__usercourse=user_course).annotate(questions_count=Count('questions'))

я получаю эту ошибку The QuerySet value for an exact lookup must be limited to one result using slicing.

Каким образом правильно написать этот запрос.

models.py

class UserCourse(models.Model):
    user = models.ForeignKey(User , null = False , on_delete=models.CASCADE)
    course = models.ForeignKey(Course , null = False , on_delete=models.CASCADE, related_name="usercourse")



class Quiz(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="quizzes")
    title = models.CharField(max_length=255)
    course = models.ForeignKey(Course, on_delete=models.SET_NULL, null=True, related_name="quizzes")
    date = models.DateTimeField(auto_now_add=True)
    slug = models.SlugField(unique=True)
    user_course = models.ForeignKey(UserCourse, on_delete=models.SET_NULL, null=True)
    def __str__(self):
        return self.title

Проблема во второй строке

user_course = UserCourse.objects.filter(user=request.user)
quizzes=Quiz.objects.filter(course__usercourse=user_course).annotate(questions_count=Count('questions'))

помните, что при использовании filter вы получаете QuerySet не один объект если вы хотите вернуть quizes те, которые связаны с user_course_queryset, вы можете использовать __in фильтр

print(user_course) # print it to understand more 
quizzes=Quiz.objects.filter(course__usercourse__in=user_course)

это вернет все Quiz связанные с QuerySet объектами

Вернуться на верх