首页 > 解决方案 > ImportError:无法导入名称“用户”

问题描述

save为我的class User. 因为我必须在创建 User 对象时创建 DriverRegistration 对象。

当我只添加方法时,save我收到一个错误,没有这种方法,代码可以正常工作

 ImportError: cannot import name 'User' from 'backend.apps.users.models' (/app/backend/apps/users/models/__init__.py)

如何修复错误?

初始化文件看起来不错:

from .user import User
from .driver_registration import DriverRegistration

用户.py

    class User(AbstractBaseUser, PermissionsMixin, TimeStampMixin):
        objects = UserManager()
    
        first_name = models.CharField(
            "first name", max_length=30, blank=True, null=True
        )
        ...
    
        def save(self, *args, **kwargs):
            super().save(*args, **kwargs)  # Create User object
            driver_registration = DriverRegistration.objects.create(user=self.pk)
            driver_registration.save()


    class UserManager(BaseUserManager):
        def create_user(
            self,
            phone_number,
            password,
            device_id=None,
            first_name=None,
            last_name=None,
        ):
            if not phone_number:
                raise ValueError("Users must have an phone number")
    
            user = self.model(
                phone_number=phone_number,
                device_id=device_id,
                first_name=first_name,
                last_name=last_name,
            )
            user.is_staff = True
            user.set_password(password)
            user.save(using=self._db)
            return user
    
        def create_superuser(self, phone_number, password):
            user = self.create_user(phone_number, password=password)
            user.is_superuser = True
            user.user_type = UserType.USER_TYPE_MANAGER
            user.device_id = hashlib.md5(
                str(random.getrandbits(32)).encode("utf-8")
            ).hexdigest()
            user.save(using=self._db)
            return user
    

driver_registration.py

class DriverRegistration(models.Model):
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        null=True,
    )

完整的错误回溯

File "/app/backend/apps/users/models/__init__.py", line 1, in <module>
^[[36mshashka-backend    |^[[0m     from .user import User
^[[36mshashka-backend    |^[[0m   File "/app/backend/apps/users/models/user.py", line 19, in <module>
^[[36mshashka-backend    |^[[0m     from backend.apps.users.models.driver_registration import DriverRegistration
^[[36mshashka-backend    |^[[0m   File "/app/backend/apps/users/models/driver_registration.py", line 2, in <module>
^[[36mshashka-backend    |^[[0m     from backend.apps.users.models import User
^[[36mshashka-backend    |^[[0m ImportError: cannot import name 'User' from 'backend.apps.users.models' (/app/backend/apps/users/models/__init__.py)

标签: pythondjango

解决方案


就实现而言 - 我认为与覆盖save方法相比,使用 Django 信号会更好。

这是一个例子:

@receiver(post_save, sender=User)
def save_driver_registration(sender, instance, created, **kwargs):
    if created:
        DriverRegistration.objects.create(user=instance.pk)

这将在创建新条目时创建一个新的 DriverRegistration 对象User。这可以说是比覆盖更好的方法,.save()因为在您的实现中,每次您.save()成为用户(例如 - 更新用户的名称/密码)时 - 您都将创建一个新DriverRegistration对象。

在此处阅读更多信息:https ://docs.djangoproject.com/en/3.1/topics/signals/


推荐阅读