【问题标题】:Django custom user with tuple as username以元组为用户名的 Django 自定义用户
【发布时间】:2018-06-06 11:38:35
【问题描述】:

我对 Django 有一定的了解,但找不到如何正确解决这个问题:

我创建了一个将在多个移动项目中使用的 API。于是我实现了一个登录时通过的Application模型。

我还创建了一个自定义用户模型:

class CustomUser(AbstractUser):

created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

username = None
email = models.EmailField('email address', unique=True)
application = models.ForeignKey(Application, null=True)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

objects = UserManager()

class Meta:
    unique_together = ('email', 'application')

我正在使用 djangorestframework-jwt。所以我有一个 API 调用,它需要一个电子邮件、密码和一个应用程序(apikey 作为字符串仅供参考)来获取令牌。

一切正常,除了在此配置中,我无法使用相同的电子邮件创建另一个用户,但使用不同的应用程序。因为我的 EmailField 是我的 USERNAME_FIELD。

是否有任何解决方案可以避免我重写所有内容?

我想到的最好的事情是添加一个唯一的字段(例如 CharField)(例如 user.id + apikey 的组合),该字段将在创建时自动填充。但是当我使用 ./manage.py createsuperuser 时,django 会要求我手动填写该字段。没什么大不了的,但如果你有更好/正确的方法,我会很高兴!

【问题讨论】:

    标签: python django authentication


    【解决方案1】:

    manytomany 代替 foreignkey 怎么样:

    class CustomUser(AbstractUser):
    
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now=True)
    
        username = None
        email = models.EmailField('email address', unique=True)
        applications = models.ManyToManyField(Application, null=True)
    
        USERNAME_FIELD = 'email'
        REQUIRED_FIELDS = []
    
        objects = UserManager()
    
        class Meta:
            unique_together = (('email', 'application'),)
    

    【讨论】:

    • 这是一个解决方案,但用户在两个不同的应用程序之间没有相同的权限
    • @Cerise 听起来有点复杂。祝您找到完美的解决方案。
    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多