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
相关产品推荐
相关产品推荐

