【问题标题】:Overriding save method of User model with Abstract user in django在 django 中用抽象用户覆盖用户模型的保存方法
【发布时间】:2018-11-22 19:12:42
【问题描述】:

具有多种两种用户类型的 Django 项目。我按照tutorial 为内置的用户模型提供了两种类型的标志。当我尝试登录到 django rest_framework_simple_jwt 的登录端点时,响应。覆盖保存方法是否有问题。

{ “non_field_errors”:[ “没有找到具有给定凭据的活动帐户” ] }

class User(AbstractUser):
    email = models.EmailField(unique=False,)
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    is_active = models.BooleanField(default=True)
    is_employee=models.BooleanField(default=False)
    is_manager=models.BooleanField(default=False)

    def save(self,*args,**kwargs):
        if self.is_employee:
                Employee.objects.create(manager=self)
        super(User,self).save(*args,**kwargs)

【问题讨论】:

    标签: django python-3.x django-models django-rest-framework django-rest-framework-jwt


    【解决方案1】:

    我认为问题在于,当您尝试创建 Employee 对象时,没有创建您的 User。一种方法是像这样使用post_save 信号:

    from django.db import models
    from django.dispatch import receiver
    
    class User(AbstractUser):
        email = models.EmailField(unique=False,)        
        # ...other fields
        # and don't override save()
    
    @receiver(models.signals.post_save, sender=User)
    def user_created(sender, instance, created, **kwargs):
        if created and instance.is_employee:
            Employee.objects.create(manager=instance)
    

    基本上,我们只想在数据库中保存用户(并且有一个pk)之后创建一个Employee

    更多参考:https://docs.djangoproject.com/en/2.0/ref/signals/#post-save

    【讨论】:

    • 我在shell中试过了。未创建 Employee 对象(未进入循环)。创建的用户也不会在 django rest 框架 simplejwt 端点获得登录访问权限。我们不是在做某种验证,比如唯一的用户名或授予用户访问权限的那种东西吗?
    猜你喜欢
    • 2012-11-06
    • 2016-05-13
    • 2012-11-26
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    相关资源
    最近更新 更多