django - 在django中用抽象用户覆盖用户模型的保存方法

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

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

{ "non_field_errors": [ "No active account found with the given credentials" ] }

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)

最佳答案

我认为问题是当您尝试创建 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

关于django - 在django中用抽象用户覆盖用户模型的保存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50833246/

相关文章:

django - 从 Django jsonfield 中提取嵌套值

Python os.path.join() - 无法正确组合

python 3.3 : struct. pack 不接受字符串

python - Django 模型 CharField 空字符串开始保存为 ('',)?

django - 在 Django 中使用 send_mail : Cannot display data in invoice from functions

javascript - django 奇怪的 Angular js 行为

python - 从 Linux 上的 Web 服务器在 Windows 上运行任务的最佳方式

python - django中的图书馆管理系统

javascript - Django 将 JSON 数据传递给静态 getJSON/Javascript

python-3.x - 类型错误 : Input 'b' of 'MatMul' Op has type float32 that does not match type int32 of argument 'a' - even after casting