You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django3.2同表原生SQL关联查询无法获取SU、CN行sda_adrid字段问题

问题根因

你使用raw()方法查询时,返回的是SsdaSdgadr模型实例,模型自带的sda_adrid属性默认对应主查询IV行的关联地址数据。你已经在SQL中给SU的地址ID定义了别名ABS、CN的地址ID定义了别名EMPF,这两个别名会作为额外属性挂载在返回的模型实例上,但你模板中没有调用这两个属性,所以一直显示IV的地址ID。

解决方案

方案1:直接调用别名(最简单,仅需改模板)

如果只需要显示地址ID,直接把模板中对应两行替换为以下代码即可:

<td>{{ la_item.ABS }}</td> <!-- 对应SU的sda_adrid_id -->
<td>{{ la_item.EMPF }}</td> <!-- 对应CN的sda_adrid_id -->

如果需要显示地址的其他字段(比如地址名称adr_name1),可以调整原生SQL,关联查询对应地址表字段后起别名:

SELECT 
    IV.id,
    IV.sda_sdgid_id,
    IV.sda_ref,
    SU.sda_adrid_id as ABS,
    SU_ADR.adr_name1 as abs_name,
    SU.sda_termvon,
    CN.sda_adrid_id as EMPF,
    CN_ADR.adr_name1 as empf_name,
    CN.sda_termbis
FROM 
    ssda_sdgadr IV
    INNER JOIN ssdg_sendung on sdg_sdgid = IV.sda_sdgid_id
    INNER JOIN ssda_sdgadr SU on SU.sda_sdgid_id = IV.sda_sdgid_id and SU.sda_satid="SU"
    INNER JOIN sadr_adresse SU_ADR on SU_ADR.adr_adrid = SU.sda_adrid_id
    INNER JOIN ssda_sdgadr CN on CN.sda_sdgid_id = IV.sda_sdgid_id and CN.sda_satid="CN"
    INNER JOIN sadr_adresse CN_ADR on CN_ADR.adr_adrid = CN.sda_adrid_id
WHERE IV.sda_satid="IV"

模板中直接调用对应别名即可:

<td>{{ la_item.abs_name }}</td>
<td>{{ la_item.empf_name }}</td>

方案2:改用ORM原生写法(可维护性更高)

不用写原生SQL,通过ORM的注解和关联查询实现相同效果:

from django.db.models import F, Q

Sendungen = SsdaSdgadr.objects.filter(sda_satid="IV").annotate(
    abs_adrid=F('sda_sdgid__ssdasdgadr__sda_adrid', filter=Q(sda_sdgid__ssdasdgadr__sda_satid="SU")),
    abs_termvon=F('sda_sdgid__ssdasdgadr__sda_termvon', filter=Q(sda_sdgid__ssdasdgadr__sda_satid="SU")),
    empf_adrid=F('sda_sdgid__ssdasdgadr__sda_adrid', filter=Q(sda_sdgid__ssdasdgadr__sda_satid="CN")),
    empf_termbis=F('sda_sdgid__ssdasdgadr__sda_termbis', filter=Q(sda_sdgid__ssdasdgadr__sda_satid="CN")),
).order_by('-sda_sdgid__sdg_datum')

模板直接调用注解的属性即可。

内容的提问来源于stack exchange,提问作者Andreas Hauser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:06:03