初次使用Django2.1.4做web单页应用(Python3.7.1),models.py 使用models.IntegerField()定义orm映射,mysql数据库版本8.0.12-winx64,使用INT类型字段,当该字段为非零情况时,可以正常查询出结果,当字段值为零时,无论使用ORMQuerySet,还是原生SQL方式(RawQuerySet、cursor)查询0值结果均为None,疑似IntegerField()把0值当False在处理;当使用models.CharField()时,把数据库字段由INT改为VARCHAR时,可以正常查询出"0"值。请教各位大神可有破解之法。小弟感激不尽!
# 初始页面
def querylist(request):
qs = ExcelView.objects.get(case_no='20191090500344')
print("qs-----------------------------")
print(type(qs))
print(qs.case_no, qs.payment_amount, qs.current_added_score, qs.current_total_score)
print("rqs----------------------------")
rqs = ExcelView.objects.raw("select * from caseinfo_excelview where `案件编号`=20191090500344")
print(type(rqs))
for v in rqs:
print(v.case_no, v.payment_amount, v.current_added_score, v.current_total_score)
print("cursor-------------------------")
cursor = connection.cursor()
cursor.execute("select * from caseinfo_excelview where `案件编号`=20191090500344")
raw = cursor.fetchone()
print(type(raw))
print(raw)
return render(request, 'querylist.html', {})
# -*- coding: UTF-8 -*-
from django.db import models
# Create your models here.
class ExcelView(models.Model):
case_no = models.CharField(db_column='案件编号', max_length=20, primary_key=True) # 案件编号
amount_of_penalty = models.IntegerField(db_column='处罚金额(元)', default=0) # 处罚金额(元)
amount_receivable = models.IntegerField(db_column='应收金额(元)', default=0) # 应收金额(元)
payment_amount = models.IntegerField(db_column='缴费金额', default=0) # 缴费金额
current_added_score = models.IntegerField(db_column='当前所加分值', default=0) # 当前所加分值
current_total_score = models.IntegerField(db_column='当前分值合计', default=0) # 当前分值合计
def __str__(self):
return self.case_no
def __unicode__(self): # __str__ on Python 3
return self.case_no
# def __next__(self):
# return [field.value_to_string(self) for field in ExcelView._meta.fields]
# def __iter__(self):
# return self
class Meta:
db_table = "caseinfo_excelview"
问题已经定位并解决。原来不是Django的锅,是mysql驱动的问题,我用的mysql-connector-python==8.0.13,这货bug超级多,使用ORM聚合函数都要报各种奇葩错误,stack overfolw上也是被吐槽不少。使用mysqlclient就没有上述0值Integer查询结果为None的问题,而且聚合函数使用也没毛病。
