【问题标题】:Django: The QuerySet value for an exact lookup must be limited to one result using slicing using djangoDjango:精确查找的 QuerySet 值必须限制为一个使用 django 进行切片的结果
【发布时间】:2022-06-12 14:14:44
【问题描述】:

我正在编写一个逻辑,允许我显示老师从数据库中创建的所有测验,现在我想通过仅根据学生注册的课程向学生显示测验来使这一点更加精确,我我正在尝试编写此过滤器,但它没有按预期工作。

models.py

class Course(models.Model):
    course_creator = models.ForeignKey(User, on_delete=models.CASCADE, related_name="quiz_user")
    course_title = models.CharField(max_length=255)
    slug = models.SlugField(unique=True)
    def __str__(self):
        return self.title

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")
    payment_status = models.CharField(max_length=100, choices=PAYMENT_STATUS, default="pending")
    date = models.DateTimeField(auto_now_add=True)


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

views.py

def StudentQuizList(request):

    user_course = UserCourse.objects.filter(user=request.user)
    quizzes = Quiz.objects.filter()

    context = {
            # 'user_course': user_course,
            'quizzes': quizzes,
    }
    return render(request, 'student_dashboard/quiz.html', context)

错误

The QuerySet value for an exact lookup must be limited to one result using slicing.

测验.html

{% for quiz in quizzes %}
       <img src="{{quiz.course.course_thumbnail.url}}" class="rounded-2" alt="Card image" style="width: 200px; height: 100px; object-fit: cover;">
      <h3 class="card-title"><a href'#'>{{quiz.course.course_title|title|truncatechars:30}}</a></h3>
        
        <span class="mb-0">{{quiz.title}}</span> 
        <span class="small d-block mt-1">({{quiz.questions_count}} Question{{quiz.questions_count|pluralize:"s"}})</span>
        <a href="{% url 'student_dashboard:take_quiz' quiz.course.slug quiz.slug %}" class="btn btn-warning-soft">Start Exam</a>
{% endfor %}

urls.py

urlpatterns = [
    path('', views.dashboard, name="student_dashboard"),
    path('quiz/', StudentQuizList, name="student-quiz"),
    path('quiz/<slug:course_slug>/<slug:quiz_slug>/', take_quiz, name='take_quiz'),        

    path('quiz/<slug:course_slug>/<slug:quiz_slug>/studentresults/', QuizResultsView, name='student_quiz_results'),
    path('taken/', TakenQuizListView.as_view(), name='taken_quiz_list'),


]

【问题讨论】:

  • 你能分享完整的回溯
  • 你能更清楚地解释一下你到底想要什么样的查询集吗?
  • @SunderamDubey 我只想显示与用户课程中的课程相关的测验,也就是说,我不想向学生显示所有测验,而只想显示相关的测验到他们注册的课程,它存储在模型UserCourse
  • @DestinyFranks 你的意思是你想要一个查询集来显示与单个登录用户选择的单个课程相关的所有测验?
  • @SunderamDubey 是的,这几乎是我想要的,我想要所有的查询集,它显示与用户注册的课程相关的所有测验,存储在 UserCourse 模型中。跨度>

标签: python django django-models django-views


【解决方案1】:

您可以在过滤器函数中传递一些条件。例如,以下查询集查找课程用户等于request.user 的测验。

quizzes = Quiz.objects.filter(course__course_creator = request.user)

【讨论】:

  • 它将是filter(course__course_creator=request.user)
  • @SunderamDubey 感谢您的回复,我不想根据登录用户创建的课程列出测验。但我想要的是:一个用户注册了一门课程,然后我想向他们展示基于他们注册的课程创建的quiz
猜你喜欢
  • 2019-10-02
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-26
  • 2020-05-05
  • 2018-10-30
相关资源
最近更新 更多