具有自定义模型和mongo db的Django用户身份验证

时间:2018-08-25 19:14:39

标签: python django mongodb

我对Django和图形数据库没有真正的经验。但是我需要在Django中使用MongoDB设置用户身份验证。

我正在使用pymongo绕过Django db设置来连接数据库。但是我仍然想使用Django身份验证。为此,我实际上应该创建一个从AbstractBaseUser扩展的用户模型,创建一个从BaseUserManager扩展的自定义用户管理器,并在设置中注册AUTH_USER_MODEL

我还创建并注册了自定义后端,该后端返回我的自定义User对象。

但是问题是,似乎Django尝试使用其数据库(设置中为sqlite)来验证我的User模型,并且找不到USERNAME_FIELD(因为实际上我没有使用此模型db。我不知道该如何告诉Django不需要关心它。

请提供任何建议吗?

2 个答案:

答案 0 :(得分:1)

您似乎需要告诉Django明确使用MongoDB作为后端数据库。在线上有许多教程,但是,根据经验我可以推荐的最好的教程是“ djongo”。

(venv) $ pip install djongo && pip freeze > requirements.txt

如果您没有安装虚拟环境,则只需使用:

$ pip install djongo

然后在settings.py中输入:

DATABASES = {
   ‘default’: {
      ‘ENGINE’: ‘djongo’,
      ‘NAME’: ‘your-db-name’,
   }
}

就是这样!从理论上讲就这么简单。 (减去要添加的所有其他数据库配置)。

要解决USERNAME_FIELD问题,只需在扩展的User类中使用类似的内容:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('email address'), unique=True)
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=30, blank=True)
    date_joined = models.DateTimeField(_('date joined'), auto_now_add=True)
    is_active = models.BooleanField(_('active'), default=True)
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)

    objects = UserManager() # <-- THIS IS YOUR CUSTOM USER MANAGER CLASS

    USERNAME_FIELD = 'email' # <-- INCLUDE THIS LINE HERE!
    REQUIRED_FIELDS = []

答案 1 :(得分:0)

这里是post,在这里我回答了类似的问题。如果您转到用户类别,则将USERNAME_FIELD = 'email'设置为您要用作用户名字段的内容。如果您不打算使用sqlite且不需要数据,请删除该文件。

如果您尚未设置要使用mongodb的设置,那么使用djongo是一个不错的选择。只需pip install djongo,然后添加

DATABASES = {
   ‘default’: {
      ‘ENGINE’: ‘djongo’,
      ‘NAME’: ‘your-db-name’,
   }
}

给您settings.py。这是关于djongo的tutorial