在过去的几天里,我做了大量的搜索,在这个话题上找到了一些令人惊奇的答案,同时我也在努力解决这个问题。但这些都不适合我,因为情况似乎与之前发布的答案不同,或者不适合我的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约定使用单数作为模型名,因此您的模型应该命名为studentsStudentProject

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

10-15 18:48