首页 > 解决方案 > 如何在 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="")

标签: djangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


你可以这样做:

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)

推荐阅读