【问题标题】:Django ORM Select Column From Two Model or MoreDjango ORM 从两个或更多模型中选择列
【发布时间】:2021-04-08 13:28:21
【问题描述】:

我想从两个或更多模型中选择带有 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('kode')的原因是什么?
  • 要合并该模型,我没有收到错误“使用的 SELECT 语句具有不同数量的列”)
  • 明白了。请在您的问题中包含模板和视图。
  • 是的,有我的模板和视图

标签: django django-models django-views django-templates django-orm


【解决方案1】:

当您使用 .values_list.values 时,您是在告诉 ORM 只选择这些列。根据docs

这与 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

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2018-04-12
    • 1970-01-01
    • 2021-05-12
    • 2019-11-15
    • 2018-10-21
    • 1970-01-01
    • 2018-11-22
    • 2020-01-02
    相关资源
    最近更新 更多