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
объектами