Django不遍历关联关系直接使用外键存储值执行startswith查询方法
解决方案
问题原因
你最初用img_documentnbr_id__startswith查询不生效,是因为你给外键字段显式指定了db_column='IMG_DocumentNbr',覆盖了Django默认生成的[外键字段名]_id格式的存储字段名,ORM无法识别img_documentnbr_id这个字段。
而img_documentnbr__drawingid__startswith的写法会触发两表的INNER JOIN,所以没有对应Tblinvrev记录的条目会被自动过滤,不符合需求。
可行方案
方案1:直接使用自定义的db_column查询(最简便)
直接用你在外键中定义的数据库列名作为过滤键,用字典传参的方式传入过滤条件,不会触发跨表关联:
DjImagingImage.objects.filter(**{"IMG_DocumentNbr__startswith": "cow"})
方案2:动态获取外键存储字段名(兼容性更好,无需硬编码列名)
通过外键字段的attname属性自动获取实际存储的字段名,避免硬编码数据库列名带来的维护问题:
# 获取DjImagingImage表中外键实际存储的字段名 fk_stored_field = DjImagingImage.img_documentnbr.field.attname # 构造过滤条件 filter_params = {f"{fk_stored_field}__startswith": "cow"} # 执行查询 result = DjImagingImage.objects.filter(**filter_params)
两种方案都仅查询DjImagingImage单表,不会关联Tblinvrev表,不会丢失无关联的记录。
内容的提问来源于stack exchange,提问作者MooCow
相关产品推荐
相关产品推荐

