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() 和 value()? (2016)
Django查询优化之select_related和prefetch_related