博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UUIDField在Django Model中的使用经验
阅读量:6858 次
发布时间:2019-06-26

本文共 1838 字,大约阅读时间需要 6 分钟。

    今天下午在将数据库从旧库导入到新库时,完成后发现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为主键的设置范例:

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

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

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

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

1
2
3
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行左右:

1
2
3
4
5
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--

本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1880987,如需转载请自行联系原作者

你可能感兴趣的文章
技术分享连载(三十三)
查看>>
Oracle Linux 6.5安装Oracle 11.2.0.4 x64
查看>>
获得Microsoft MVP后的感受!!!!
查看>>
Nginx 教程 #3:SSL 设置
查看>>
Exchange Server 2003 规划与部署
查看>>
struts2中类型转换器的使用
查看>>
三星正式超越Intel成为了芯片行业的老大
查看>>
快速预览Office 15服务端:Exchange 2013
查看>>
技术与创业不矛盾(两者是先后关系)
查看>>
临时数据库之python用sqlite3模块操作sqlite
查看>>
ODS实现过程
查看>>
CentOS6.5固定IP方式上网(NAT)
查看>>
剑破冰山—Oracle开发艺术 书评(by yangtingkun)
查看>>
如何用手机维护Mysql数据库
查看>>
REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式...
查看>>
基于CentOS 5.3平台下搭建PXE部署ESX&ESXi 4.x模板分发服务器 v1.0
查看>>
使用tornado模板引擎配合yaml构建nginx配置接口 [扩展saltstack]
查看>>
网络作者的心声-1、感谢读者,我不会太监
查看>>
WCF分布式开发常见错误解决(1):添加服务引用出错
查看>>
Nginx实战基础篇六 通过源码包编译安装部署LNMP搭建Discuz论坛
查看>>