首页 > 解决方案 > AttributeError:“经理”对象没有属性“保存”

问题描述

我创建了一个模型类 Admin、Entrepreneur、CustomUser 和两个函数,它们首先将数据添加到这些类中,我还定义了两个接收器,它们仅在 CostumUser 类中添加数据时运行


这是我的模型文件:


from django.db import models
from django.contrib.auth.models import *
#user
from django.db.models.signals import post_save
from django.dispatch import receiver


class CustomUser(AbstractUser):
    user_type=((1,"admin"),(2,"staff"))
    user_type=models.CharField(default=1,choices=user_type,max_length=10)

# Entrepreneur
class Entrepreneur(models.Model):
    id_models= models.IntegerField(primary_key=True)
    admin=models.OneToOneField(CustomUser,on_delete=models.CASCADE)

    date_naissance=models.DateField()
    adresse_entr=models.CharField(max_length=20)
    telephone=models.IntegerField()
    statut_social=(('ce','celébataire'),
                   ('ma','marié'),
                   ('di','divorcé'),
                   ('ve','veuf'),
                   )
    occupation=models.CharField(max_length=50)
    niveau_scolaire=(
        ('pri','primaire'),
        ('sec','secondaire'),
        ('cap','certificat aptitude professionel'),
        ('btp','brevet technicien professionel'),
        ('bts','brevet technicien superieur'),
        ('lic','license'),
        ('mai','maitrise'),
        ('mas','mastere'),
        ('doc','doctorat'),
                    )
    niveau_scolaire=models.CharField(default='ser',choices=niveau_scolaire,max_length=50)
    annnee_exp=models.IntegerField()

#Projet
class Projet(models.Model):
    id_models=models.IntegerField(primary_key=True)
    nom_projet=models.CharField(max_length=30)
    lieu_implantation=models.CharField(max_length=20)
    type_projet=(
        ('ser','service'),
        ('com','commerce'),
        ('agr','agricuture'),
        ('ind','industrie'),
        ('IT','technologie information'),
        ('art','artisanat'),
        ('tor','tourisme'),
    )
    type_projet=models.CharField(default='ser',choices=type_projet,max_length=50)
    produit=models.CharField(max_length=50)
    id_promoteur=models.ForeignKey(Entrepreneur,on_delete=models.CASCADE)
#admin
class Admin(models.Model):
    id_admin=models.AutoField(primary_key=True)
    admin = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
    objects=Manager()

@receiver(post_save,sender=CustomUser)
def create_user_profile(sender,instance,created,**kwargs):
    if created:
        if instance.user_type==1:
            Admin.objects.create(admin=instance)
        if instance.user_type==2:
            Entrepreneur.objects.create(admin=instance)

@receiver(post_save,sender=CustomUser)
def save_user_profile(sender,instance,**kwargs):
    if instance.user_type==1:
        Admin.objects.save()
    if instance.user_type==2:
        Entrepreneur.objects.save()

我运行 makemigration 并在运行 createupeuser 和创建(用户名、电子邮件和密码)之后执行迁移命令


我收到此错误:


Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\core\management\__init__.py", 
line 401, in execute_from_command_line
    utility.execute()
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\core\management\__init__.py", 
line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\core\management\base.py", line 
328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\hp\PycharmProjects\business\lib\site- 
packages\django\contrib\auth\management\commands\createsuperuser.py", line 79, in execute
    return super().execute(*args, **options)
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\core\management\base.py", line 
369, in execute
    output = self.handle(*args, **options)
  File "C:\Users\hp\PycharmProjects\business\lib\site- 
packages\django\contrib\auth\management\commands\createsuperuser.py", line 189, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\contrib\auth\models.py", line 
158, in create_superuser
    return self._create_user(username, email, password, **extra_fields)
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\contrib\auth\models.py", line 
141, in _create_user
    user.save(using=self._db)
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\contrib\auth\base_user.py", 
line 66, in save
    super().save(*args, **kwargs)
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\db\models\base.py", line 745, 
in save
    self.save_base(using=using, force_insert=force_insert,
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\db\models\base.py", line 793, 
in save_base
    post_save.send(
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\dispatch\dispatcher.py", line 
173, in send
    return [
  File "C:\Users\hp\PycharmProjects\business\lib\site-packages\django\dispatch\dispatcher.py", line 
174, in <listcomp>
    (receiver, receiver(signal=self, sender=sender, **named))
  File "C:\Users\hp\PycharmProjects\business\oasisconsuting\businessplan\models.py", line 74, in 
save_user_profile
    Admin.objects.save()
AttributeError: 'Manager' object has no attribute 'save'

怎么了 !以及如何解决我的错误?

标签: django-models

解决方案


# managers.py
from django.contrib.auth.models import BaseUserManager

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError("The given email must be set")

        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email, password=None, **extra_fields):
        extra_fields.setdefault("is_staff", False)
        extra_fields.setdefault("is_superuser", False)
        return self._create_user(email, password, **extra_fields)

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self._create_user(email, password, **extra_fields)

在你的用户类中models.py添加这个objects = UserManager()


推荐阅读