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为主键的设置范例:

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,如需转载请自行联系原作者


相关文章
|
8月前
|
数据库 Python
[Python]Django模型(Model)(二)
[Python]Django模型(Model)(二)
|
8月前
|
设计模式 SQL 数据库
|
9月前
|
Python
django model进阶学习
django model进阶学习
31 0
|
10月前
|
存储 关系型数据库 MySQL
Django第2步_创建model数据库表
Django第2步_创建model数据库表
84 0
|
数据库 Python
Django model 层之事务管理总结
Django model 层之事务管理总结
76 0
|
SQL JSON 测试技术
Django model层之执行原始SQL查询
Django model层之执行原始SQL查询
87 0
|
关系型数据库 MySQL 数据库
Django model 层之聚合查询总结
Django model 层之聚合查询总结
79 0
|
SQL 存储 缓存
Django model 层之Making Query总结2
Django model 层之Making Query总结
81 0
|
SQL 关系型数据库 MySQL
Django model 层之Making Query总结1
Django model 层之Making Query总结
52 0
|
存储 SQL 网络协议
Django model 层之Models与Mysql数据库小结2
Django model 层之Models与Mysql数据库小结
103 0