django - 如何在 django 模型中将字符串添加到主键
问题描述
我希望我的 id 是“ssid”+(autoimcrement id)例如:ssid001
这是我的用户模型
class User(models.Model):
id = models.AutoField(primary_key=True, editable=False, unique=True, max_length=99999)
phone = models.CharField(max_length=12, unique=True,default="")
name = models.CharField(max_length=50,default="")
email = models.EmailField(max_length=50,default="")
解决方案
你可以这样做:
class User(AbstractUser):
pub_id = models.CharField(editable=False, unique=True, max_length=50)
def save(self, *args, **kwargs):
'''
--User model save method--
if not self.id makes sure the save only runs on first save.
'''
if not self.id:
self.pub_id = f'ssid00{self.id}'
return super(User, self).save(*args, **kwargs)
确保在第一次迁移之前使用 AbstractUser 覆盖 User 模型,否则可能会遇到问题。在保存中,您可以执行任何逻辑来添加新的 pub_id,我举了一个例子。我发现单独留下 primary_key 会减少我的项目的问题,所以我总是只放置一个新的 pub_id 字段。这个新的 pub_id 可用于详细信息页面,因此您不会将顺序键暴露给世界。
例如,在您的前端模板中,您可以这样做:
{% url 'user-detail' pub_id=user.pub_id %}
代替:
{% url 'user-detail' id=user.id %}
但这仍然显示您的顺序键,所以我会使用 uuid:
import uuid
class User(AbstractUser):
pub_id = models.CharField(editable=False, unique=True, max_length=50)
def save(self, *args, **kwargs):
'''
--User model save method--
1) Sets self.pub_id to UUID hex on first save.
'''
if not self.id:
self.pub_id = str(uuid.uuid4().hex)
return super(User, self).save(*args, **kwargs)
推荐阅读
- python - power bi中添加语言检测栏
- python - 根据另一个数组的特定值递增和插入值
- firebase - 如果我想在本机模式和数据存储模式下一起使用数据存储,是否可以使用 2 个谷歌云项目?
- r - 执行块后删除变量
- python - 为什么我在 20% 的尝试中得到 pymodbus ModbusIOException?
- python - 创建数据框子集的散点图
- python - 美丽的汤不等到页面完全加载
- java - Sikuli 无法通过 Jenkins 在屏幕上找到图像
- jenkins - 我想从其他参数创建一个参数值
- java - 运行 GWT 应用程序时出现 jreLeakPrevention.gcDaemonFail 错误