Django查询:如何用isdel做WHERE条件但不返回该字段?
解决方案
直接用Django ORM提供的defer()方法就能满足你的需求,不需要删除模型里的isdel字段,具体实现如下:
方法一:使用defer()排除指定字段
defer()会让ORM查询时不加载指定字段,返回的仍然是Series模型实例,但实例中不会包含isdel字段,同时你依然可以用isdel作为过滤条件(因为模型里保留了这个字段映射):
# 执行查询,过滤条件不变,排除isdel字段,按id排序 series_list = Series.objects.filter(istrend=1, status=1, isdel=0).order_by('id').defer('isdel')
如果之后不小心访问series.isdel,Django会单独发起一次查询获取该字段值,但既然你不需要这个字段,完全可以忽略这个情况。
方法二:动态指定返回字段(返回字典)
如果更倾向于返回字典格式的数据,可以先动态获取模型中除isdel外的所有字段名,再用values()指定返回这些字段:
from django.db.models.fields import Field # 提取模型中所有非isdel的字段名 field_names = [f.name for f in Series._meta.get_fields() if isinstance(f, Field) and f.name != 'isdel'] # 执行查询,返回包含指定字段的字典列表 series_dict_list = Series.objects.filter(istrend=1, status=1, isdel=0).order_by('id').values(*field_names)
这种方式返回的是字典,适合只需要原始数据、不需要调用模型方法的场景。
注意:绝对不能删除模型里的isdel字段,因为Django ORM需要通过模型字段来解析过滤条件中的isdel关键字,删除后会导致FieldError,这是ORM的基础逻辑决定的。
内容的提问来源于stack exchange,提问作者Ghost Ghaith
相关产品推荐
相关产品推荐

