在过去的几天里,我做了大量的搜索,在这个话题上找到了一些令人惊奇的答案,同时我也在努力解决这个问题。但这些都不适合我,因为情况似乎与之前发布的答案不同,或者不适合我的Django版本。所以说:
我需要从3个表中获取数据,并在web界面上显示某些列。我买一张桌子没问题,但另外两张(用外键连接)我似乎看不到。我的代码如下(请注意,我正在学习python和django):models.py:
class students(models.Model):
date_created = models.DateTimeField()
project = models.ForeignKey('projects',models.SET_NULL,blank=True,null=True,)
name = models.TextField()
return_date = models.TextField()
class sysinfo(models.Model):
student = models.ForeignKey('students',models.SET_NULL,blank=True,null=True,)
machine = models.TextField(blank=True, null=True)
version = models.TextField(blank=True, null=True)
platform = models.TextField(blank=True, null=True)
hostname = models.TextField(blank=True, null=True)
class projects(models.Model):
project_name = models.TextField()
date_created = models.DateTimeField()
date_closed = models.DateTimeField(blank=True, null=True)
views.py
from django.shortcuts import render
from front.models import students, projects, sysinfo
# Create your views here.
def index(request):
list_students = students.objects.select_related('projects','sysinfo').order_by('-last_seen')
return render(request, 'main/home.html',{'students': list_students})
这显示了webinterface上的学生id、创建日期和返回日期,但我似乎无法从projects表中获取项目名称,也无法从sysinfo中获取系统信息。
我已尝试将.values('projects\u project\u name','sysinfo\u hostname'…等)添加到views.py select\u相关行。但我只会错误地说我的选择是学生表中的字段。
我对我所做的一切都记不清了,但可以肯定的是,到现在为止,文档对我来说真的没有任何意义了。(事实上,我创建了一个帐户,所以仅仅是为了问这个问题,应该说很多:P)
提前谢谢大家
最佳答案
首先,让我们修复查询。您希望将select_related
用于项目,将prefetch_related
用于sysinfo
(注意,对于您的模型astudent
有零个、一个或多个sysinfo
)。此外,还需要为selected_related
使用foreignkey字段名,为sysinfo_set
使用反向关系名(在您的情况下是默认的sysinfo
)。最后,您的模型中没有last_seen
字段。。。
def index(request):
list_students = students.objects.select_related('project').prefetch_related('sysinfo_set')
现在在您的模板中:
<table>
{% for student in students %}
<tr>
<td>{{ student.name }}</td>
<td>{{ student.project.project_name }}</td>
<td>
{% for sysinfo in student.sysinfo_set.all %}
{{ sysinfo.host_name }}
{% endfor %}
</td>
</tr>
{% endfor %}
</table>
另请注意:Python约定使用CamelCase作为类名,而Django约定使用单数作为模型名,因此您的模型应该命名为
students
、Student
和Project
。关于python - 在Django的一个 View 中合并来自三个表的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51258855/