微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django自定义用户UUID已重复已缓存?

如何解决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不会改变!

enter image description here

我想这是一个缓存问题。有人对我该如何解决吗? (可能保留我的自定义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 举报,一经查实,本站将立刻删除。