如何解决Django自定义用户UUID已重复已缓存?
我正在将Django与具有自定义UUID和自定义用户管理器的自定义用户模型配合使用:
class CustomUser(AbstractUser):
id = models.UUIDField(primary_key=True,default=generate_id(),editable=False)
# ...
如您所见,我没有使用default=uuid4()
。相反,我自己创建了一个函数,使用uuid()来生成自定义id,同时也使用了时间戳:
from datetime import datetime as dt
from uuid import uuid1,uuid3,uuid4
def generate_id():
timestamp = str(dt.timestamp(dt.Now()))
return uuid3(uuid4(),timestamp)
现在,如果我打开交互式外壳程序:python manage.py shell
并且多次调用函数,这就是我得到的:
>>> generate_id()
UUID('bd8279f1-9b4b-3d7d-8932-f9e725f17045')
>>> generate_id()
UUID('0c2ec2ad-b062-3915-a9e9-22842c6f5ea2')
>>> generate_id()
UUID('2289202b-f252-3b27-bcae-cd44825bf4e0')
>>> generate_id()
UUID('88676ea9-4902-36ac-857d-929cb133089c')
>>> generate_id()
UUID('4a18b33e-12f0-3803-8ff0-0c4f0d1c849c')
但是当我尝试创建2个用户时:
from users.models import CustomUser
>>> one = CustomUser.objects.create_user(email='hhh@jaja.com',password='JJlsaks16112')
>>> two = CustomUser.objects.create_user(email='ttth@jija.com',password='JJlsaks16112')
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py",line 84,in _execute
return self.cursor.execute(sql,params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/MysqL/base.py",line 73,in execute
return self.cursor.execute(query,args)
File "/usr/local/lib/python3.8/site-packages/MysqLdb/cursors.py",line 206,in execute
res = self._query(query)
File "/usr/local/lib/python3.8/site-packages/MysqLdb/cursors.py",line 319,in _query
db.query(q)
File "/usr/local/lib/python3.8/site-packages/MysqLdb/connections.py",line 259,in query
_MysqL.connection.query(self,query)
MysqLdb._exceptions.IntegrityError: (1062,"Duplicate entry 'b448f583acfb31b7955926689b60f28a' for key 'PRIMARY'")
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<console>",line 1,in <module>
File "/foodbook24-api/users/models.py",line 23,in create_user
user.save()
File "/usr/local/lib/python3.8/site-packages/django/contrib/auth/base_user.py",line 67,in save
super().save(*args,**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py",line 753,in save
self.save_base(using=using,force_insert=force_insert,File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py",line 790,in save_base
updated = self._save_table(
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py",line 895,in _save_table
results = self._do_insert(cls._base_manager,using,fields,returning_fields,raw)
File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py",line 933,in _do_insert
return manager._insert(
File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py",line 85,in manager_method
return getattr(self.get_queryset(),name)(*args,**kwargs)
File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py",line 1254,in _insert
return query.get_compiler(using=using).execute_sql(returning_fields)
File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py",line 1397,in execute_sql
cursor.execute(sql,params)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py",line 98,in execute
return super().execute(sql,line 66,in execute
return self._execute_with_wrappers(sql,params,many=False,executor=self._execute)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py",line 75,in _execute_with_wrappers
return executor(sql,many,context)
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py",params)
File "/usr/local/lib/python3.8/site-packages/django/db/utils.py",line 90,in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py",query)
django.db.utils.IntegrityError: (1062,"Duplicate entry 'b448f583acfb31b7955926689b60f28a' for key 'PRIMARY'")
如果我进入数据库并修改第一个自定义用户的ID,则可以创建第二个用户,但是从下面的屏幕截图中可以看到,该ID不会改变!
我想这是一个缓存问题。有人对我该如何解决吗? (可能保留我的自定义UUID函数)。
解决方法
您正在调用函数,因此default=…
parameter [Django-doc]将被设置为响应的 result ,而不是函数,因此实际上是每个当您生成对象时,它将使用该结果。
因此,您应该传递对 callable 的引用,而不是结果:
class CustomUser(AbstractUser):
# no parenthesis ↓
id = models.UUIDField(primary_key=True,default=generate_id,editable=False)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。