【问题标题】:Django - How to assign AuthUser id(PK) to username?Django - 如何将 AuthUser id(PK) 分配给用户名?
【发布时间】:2018-12-05 23:56:09
【问题描述】:

我想将生成的id 分配给AuthUser 模型的username 列。我该怎么做?

我尝试更新UserManager,但没有成功。这就是我所做的。

def _create_user(self, username=None, email=None, password=None,
                 **extra_fields):
    """
    Create and save a user with the given email, and password.
    """
    email = self.normalize_email(email)
    user = self.model(email=email, **extra_fields)
    if not username:
        username = user.id  # it always returns None.

    user.username = self.model.normalize_username(username)

    user.set_password(password)
    user.save(using=self._db)
    return user

我该怎么做?

【问题讨论】:

  • 试试Django post_save Signal之类的东西怎么样
  • 不。 Django 需要 username 作为必填字段。我不能save,抛开post_save
  • 如果我没记错的话,user.id 将是 None,直到创建数据库行
  • 这意味着not username 将永远是True
  • 为什么不在user.save(using=self._db)后面赋值username,这样就可以得到用户对象的id,然后再保存。

标签: python django django-models django-users


【解决方案1】:

如果我理解你的目标。您需要首先使用用户的信息(电子邮件、用户名、密码等)实例化用户实例来创建用户,然后保存用户,以便他们在数据库中。保存用户后,您可以获取该用户对象并将用户名重新分配给 id: 用户 = User.objects.get(用户名 = 用户名) user.username = user.id 我相信你什么都没有,因为用户不存在,因此没有用户反对从中获取 id。调试并确认此行中有一个用户对象user = self.model(email=email, **extra_fields)

【讨论】:

  • 我在其他 cmets cmets 上注意到所需的用户名,但您在没有它的情况下正在保存。 Bijoy 的随机用户解决方案是可以接受的,因为您立即更改它,另外您是否尝试过空字符串? simpleisbetterthancomplex.com/tips/2016/07/25/…
【解决方案2】:

正如我在 cmets 中所说,我的建议是给 username 一个虚拟值以暂时保存模型,然后在保存后更改值

def _create_user(self, username=None, email=None, password=None,
                 **extra_fields):
    """
    Create and save a user with the given email, and password.
    """
    email = self.normalize_email(email)
    user = self.model(email=email, **extra_fields)
    user.username = self.model.normalize_username('placeholder')
    user.set_password(password)
    user.save(using=self._db)

    user.username = '{}'.format(user.id)  # As the 'id' will always be unique
    user.save(using=self._db)
    return user

username 的值为'placeholder',每次都会更改为id 的值,所以不会有用户名唯一性的问题。

【讨论】:

    【解决方案3】:

    您需要通过调用user.save 将用户保存到数据库 - 数据库在保存时生成的id 然后将在user 实例上可用。

    【讨论】:

    • 正确,但 Django 要求用户名作为必填字段。如何保存?
    猜你喜欢
    • 2020-06-08
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2021-10-02
    • 2021-04-26
    • 2022-10-07
    • 2011-07-14
    • 2015-02-14
    相关资源
    最近更新 更多