标签:ase null 生效 har 导致 mysq abs 不一致 列表
本地测试环境:
Django 3.0.6
mysql 5.7.17
在Django中使用orm model中定义的char类型 与 数字进行比较时,返回的结果集不正确。
查看翻译成的sql语句, 在mysql中执行没有问题。
# 目的为筛选出给定字段不为null 且大于0的数据,or连接
def make_q_condition(field_list):
"""
制作q查询条件
:param field_list: 条件字段列表
:return:
"""
filter_condition = Q()
not_null_str = "%s__isnull"
count_str = "%s__gt"
for field in field_list:
q = Q()
q.connector = "and"
q.children.append((not_null_str % field, False))
q.children.append((count_str % field, 0))
filter_condition.add(q, "or")
return filter_condition
- 给定字段中在数据库中定义类型为 varchar 而非 int。而且无权限改变字段和model对应字段类型(别的业务需要用到)
ps:吐槽下建表的人。每个为0的数据存的还不一样 有可能是 0,0.0,0.00,0.000 吐了
原生sql执行时会转为int进行比较,满足条件为1, 不满足条件为0。但orm对此类情况的结果集处理与mysql不一样。
# 例子,注:使用Abs强制转换对应char字段
result = base_query.annotate(
mark_count_abs=Abs(F("mark_count")),
track_length_abs=Abs(F("track_length")),
).filter(filter_condition, **condition).values("user_id", "user_name").distinct()
count_str = "%s__gt" 修改为 count_str = "%s_abs__gt"
标签:ase null 生效 har 导致 mysq abs 不一致 列表
原文地址:https://www.cnblogs.com/niehongxu/p/13268657.html