首页 > 解决方案 > 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)

标签: djangodjango-modelsdjango-viewsdjango-templatesdjango-orm

解决方案


当您使用.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如果您愿意,注释方法也可以完全避免使用。


推荐阅读