select_related和prefetch_related - 未在查询中获得结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select_related和prefetch_related - 未在查询中获得结果相关的知识,希望对你有一定的参考价值。

我正在尝试制作简单的学习项目,我将获取所有记录并在html上显示。我的模特是:

class Student(models.Model):
 stuName = models.CharField(max_length=100)
 stuCity = models.CharField(max_length=100)
 stuPhone = models.IntegerField(max_length=10)
 stuNationality = models.CharField(max_length=50)
 stuCreatedt = models.DateTimeField(default=timezone.now)
 def __str__(self):
     return '%s %s %s' % (self.stuName,self.stuCity,self.stuNationality)


class Dept(models.Model):
 deptId = models.AutoField(primary_key=True)
 deptName = models.CharField(max_length=100)
 def __str__(self):
      return '%s %s' % (self.deptId, self.deptName)




class Course(models.Model):
 courseId = models.AutoField(primary_key=True)
 courseName = models.CharField(max_length=100)
 enrolledStu = models.IntegerField(max_length=3)
 students = models.ManyToManyField(Student)
 dept = models.ForeignKey(Dept, on_delete=models.CASCADE)
 def __str__(self):
      return '%s %s %s %s' % (self.courseName,self.enrolledStu,self.students,self.dept)

从这个模型我试图使用以下查询显示学生,课程和部门信息:

course = Course.objects.all().prefetch_related('students').select_related('dept')

我的HTML代码是:

{% for c in course %}
    <tr>
        <td>{{c.students.stuName}}</td>
        <td>{{c.students.stuCity}}</td>
        <td>{{c.dept.deptName}}</td>
        <td>{{c.courseName}}</td>
        <td><a href="#">Edit</a> </td>
    </tr>
{% endfor %}

我无法显示学生信息..任何人都可以帮我纠正我的错误。我假设我的查询不正确。

约旦

答案

由于students是多对多的领域并且包含学生列表,您需要迭代students.all以获取学生信息:

{% for c in course %}
    <tr>
        {% for student in c.students.all %} 
            <td>{{student.stuName}}</td>
            <td>{{student.stuCity}}</td>
        {% endfor %} 
        <td>{{c.dept.deptName}}</td>
        <td>{{c.courseName}}</td>
        <td><a href="#">Edit</a> </td>
    </tr>
{% endfor %}
另一答案

对于每门课程,您可以显示有关课程的独特详细信息,然后在下表中显示已注册的学生...

{% for c in course %}
    <p>{{c.dept.deptName}}</p>
    <p>{{c.courseName}}</p>
    <p><a href="#">Edit</a> </p>

    {% for s in c.students.all %}
    <tr> 
        <td>{{s.stuName}}</td>
        <td>{{s.stuCity}}</td>
    </tr>
    {% endfor %}
{% endfor %}

以上是关于select_related和prefetch_related - 未在查询中获得结果的主要内容,如果未能解决你的问题,请参考以下文章

Django:select_related() 的用法和执行时间性能

如何使用 select_related

如何结合 select_related() 和 value()? (2016)

Django查询优化之select_related和prefetch_related

select_related和prefetch_related

pythonのdjango select_related 和 prefetch_related()