django - Django ORM 从两个或更多模型中选择列
问题描述
我想从两个或更多模型中选择带有 django orm 的列。
SELECT nim, k.kode, s.nama, sks, nilai, th_ajaran FROM mahasiswa_khs k, mata_kuliah_si s WHERE k.kode = s.kode AND nim = %s
这是我的代码
khs = Khs.objects.filter(nim=nim).values_list('kode').union(SI.objects.all().values_list('kode'))
但是,我在模板中调用它没有显示
这是我的模板:
{% for khs in khs %}
<tr>
<td>{{forloop.counter}}</td>
<td>{{khs.kode}}</td>
<td>{{khs.nama}}</td>
<td>{{khs.sks}}</td>
<td class="vertical-align-mid">{{khs.nilai}}</td>
<th>{{khs.th_ajaran}}</th>
</tr>
{% endfor %}
和观点:
khs = Khs.objects.filter(nim=nim).union(SI.objects.all().values_list('kode'))
context ={
'khs' : khs,
}
return render(request, 'mahasiswa/mahasiswa.html',context)
解决方案
当您使用.values_list
或.values
告诉 ORM 仅选择这些列时。根据文档:
这类似于 values() ,只是它不是返回字典,而是在迭代时返回元组。每个元组包含来自各个字段或表达式的值,传递给 values_list() 调用 - 所以第一项是第一个字段,等等。例如:
from django.db.models.functions import Lower Entry.objects.values_list('id', Lower('headline')) <QuerySet [(1, 'first entry'), ...]>```
由于您使用的是values_list
,这意味着您要提取一个如下所示的数据集:[('kode_value_1',), ('kode_value_2', ), ...]
。在您的模板中,您将使用:
{% for values in khs %}
{{ values.0 }}
{% endfor %}
为了提取其他字段,例如nama
,您需要调整查询集:
khs = ( Khs.objects.filter(nim=nim) .values_list('kode', 'nama') .union(SI.objects.all().values_list('kode', 'nama')) )
然后在您的模板中,您将拥有:
{% for values in khs %}
kode: {{ values.0 }}
nama: {{ values.1}}
{% endfor %}
如果您想使用字段名称,那么您应该使用values()
而不是values_list()
这样您的模板标签将是{{ values.kode }}
在SI
没有该nama
字段的情况下,您可以进行注释以设置一个虚拟值,以便发生联合。
from django.db.models import Value, CharField
khs = (
Khs.objects.filter(nim=nim)
.values_list('kode', 'nama')
.union(
SI.objects
.annotate(nama=Value(None, output_field=CharField()))
.values_list('kode', 'nama')
)
)
我猜这nama
是一个 CharField。您可能需要根据数据模型的需要进行更改。.values_list
如果您愿意,注释方法也可以完全避免使用。
推荐阅读
- wordpress - 我正在尝试在我的 wordpress 网站上摘录一条长评论
- sql - “带查询”与“临时表”性能明智
- r - 使用 Winsorize 函数在 R 中按列对数据进行 Winsorize
- apache-spark - 如何防止使用 Spark DataFrames 处理文件两次
- reactjs - 为什么不工作 react-quill getEditor of null
- php - 使用 PHP 将新节点添加到每个项目的 XML 中,并将变量作为属性
- php - 如何在 php post 表单中制作单独的电话号码?
- sql - 如何加入与原始无关的其他值
- python - 为什么代码中显示的 else 在这种情况下不起作用?
- c++ - 如何在 C++ 中覆盖 BlueprintNativeEvent 函数?