UUIDField在Django Model中的使用经验

    今天下午在将数据库从旧库导入到新库时,完成后发现Django网站无法打开,报“ValueError, badly formed hexadecimal UUID string”,最终定位到原因是一个UUIDField类型字段的值为0,造成Django无法将0验证为UUID类型,从而引发ValueError异常。现总结UUIDField在Django Model中的使用经验如下。

    在Django中UUIDField类型的字段可以作为主键(主键是绝对不可能为NULL值的)使用,这个是丝毫没问题的,但是如果其他非主键字段使用UUIDField类型,则最好是将这个字段的默认值设置成Python中的None类型,即default=None,设置范例如下:

UUIDField为主键的设置范例:

idappasswd = models.UUIDField(primary_key=True, auto_created=True, default=uuid.uuid4, editable=False)

非空字段类型为UUIDField时,必须设置default=某个UUID的值,可以是uuid4(),也可以是别的uuid值,设置范例如下:

appuuid = models.UUIDField(default=uuid.uuid4, null=False,
                           verbose_name=u'app uuid',
                           help_text="app uuid")

可以为空的UUIDField字段类型的设置范例:

associatedappuuid = models.UUIDField(default=None, null=True, blank=True,
                                     verbose_name=u'associated uuid',
                                     help_text="associated app uuid")


代码注解:上面的三行代码中,idappasswd 是作为主键使用,appuuid 是app的UUID不能为空,associatedappuuid 作为app的关联UUID,如果没有关联,因此可以为空。
使用注意:
1.在MySQL数据库中UUIDField类型一定是32位的char类型,在数据库Model中,开发者不需要设置max_length=xxx,因为这个max_length的数值默认的一定是32。
2.如果某个字段的类型是UUIDField,并且设置为空,则最好将其设置为null=True,在数据库中,此字段的值不能为空('')也不能为0(数字0),并且建议设置default=None。
3.以上内容在Django 1.10.3上经过测试
因为UUIDField的内容如果不为None,则会被Django进行严格检查(此处应该不能认为是bug或issue),验证的代码如下:
django/db/backends/mysql/operations.py 211行左右:

def convert_uuidfield_value(self, value, expression, connection, context):
    if value is not None:
        value = uuid.UUID(value)

    return value

如果value不是None,则会进行执行uuid.UUID()函数,如果参数value不为None,则会在uuid.py模块中的__init__中raise异常ValueError badly formed hexadecimal UUID string。
总结:
1.排查问题的要领是不断的缩小问题存在的范围,一定要使用排除法,这个要时刻牢记。
2.如果某个字段的类型是UUIDField,并且设置为空,则最好将其设置为null=True,并且建议设置default=None。
tag:Django UUIDField, Django ValueError, badly formed hexadecimal UUID string
--end--


优秀的个人博客,低调大师

微信关注我们

原文链接:https://blog.51cto.com/dgd2010/1880987

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。