升级到Django 1.8.3后,我需要从使用django_extensions.db.fields.UUIDField
更改为新的django.db.models.UUIDField
。
问题是旧版本被定义为带有连字符的varchar(36)
,而新版本是char(32)
没有连字符。
我肯定看到没有这些连字符的尺寸好处。
我试了一下,正如我所担心的那样,列中的数据会被截断。
当我检查字段的定义时,它用以下内容初始化:
def __init__(self, verbose_name=None, **kwargs):
kwargs['max_length'] = 32
super(UUIDField, self).__init__(verbose_name, **kwargs)
此定义会阻止对max_length的任何覆盖。
当然我可以更新每个UUIDFields我必须删除连字符,但这是一个相当长的过程,因为我的表非常大。 有关信息,这是我必须运行的那种查询:
UPDATE myTable
SET uuid_field = REPLACE(uuid_field, '-', '');
所以我的问题是,对于使用UUIDFields为每个表的每一行运行一个巨大的更新,你有什么更好的想法吗?
答案 0 :(得分:1)
哦,更新数据库中的每个UUID字段太痛苦了,我重新实现了类似于旧django_extensions.db.fields.UUIDField
的内容。
Django的第一个目标是Postgres,它有自己的UUID字段类型(没有连字符),但MySQL没有。
如果您正在创建一个新字段,Django的新UUIDField可以很好地工作,但如果您已有数据,则会很痛苦。
答案 1 :(得分:0)
我也遇到了同样的问题。最终只是走了一条简单的路线并定义了我自己的模型字段。
from django.db import models
class UUIDField(models.UUIDField):
def __init__(self, *args, **kwargs):
kwargs['max_length'] = 36
super(models.UUIDField, self).__init__(*args, **kwargs)