gpt4 book ai didi

python - 在 Django 的一个 View 中组合来自三个表的数据

转载 作者:行者123 更新时间:2023-11-29 14:09:02 25 4
gpt4 key购买 nike

在过去的几天里,我在尝试解决这个问题时进行了大量搜索,并找到了一些关于这个主题的惊人答案。但是这些都不适合我,因为情况似乎与之前发布的答案不同,或者不适用于我的 Django 版本。所以这里是:

我需要从 3 个表中获取数据并在网络界面上显示某些列。我得到一张 table 没有问题,但其他两个(由外键链接)我似乎无法进入 View 。我的代码如下(请注意,我正在学习 python 和 django):

模型.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})

这在 Web 界面上显示了学生 ID 和创建日期以及返回日期,但我似乎无法从项目表中获取项目名称,或从 sysinfo 中获取系统信息。

我尝试将 .values('projects__project_name','sysinfo__hostname'...etc.) 添加到 views.py select_related 行。但我只收到错误消息,说我的选择是学生表中的字段。

我已经忘记了我尝试过的一切,但可以肯定地说,现在的文档对我来说真的已经没有任何意义了。 (事实上​​我为 SO 创建了一个帐户只是为了问这个问题应该说很多 :P)

先谢谢大家

最佳答案

首先让我们修复查询。您想对项目使用 select_related,对 sysinfo 使用 prefetch_related(请注意,对于您的模型,student 为零,一个或多个 sysinfo)。您还想为 selected_related 使用外键字段名称,为 sysinfo 使用反向关系名称(在您的情况下为默认的 sysinfo_set)。最后,您的 students 模型中没有 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 约定是使用单数形式作为模型名称,因此您的模型应命名为 StudentProject SysInfo

关于python - 在 Django 的一个 View 中组合来自三个表的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51258855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com