ImportError:无法导入名称“用户"
我为 class User
创建了自定义的 save
方法.因为创建用户对象时必须创建DriverRegistration对象.
I created custom save
method for my class User
. Because I have to create DriverRegistration object when I create User object.
当我仅添加方法 save
时,我收到一条错误消息在没有此方法的情况下代码可以正常工作
When I added only method save
i received an error the code works fine without this method
ImportError: cannot import name 'User' from 'backend.apps.users.models' (/app/backend/apps/users/models/__init__.py)
如何解决该错误?
初始化文件看起来不错:
Init file looks fine:
from .user import User
from .driver_registration import DriverRegistration
user.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)
只是实现问题-与覆盖 save
方法相比,我认为使用Django信号会更好.
Just as a matter of implementation - I think you would be better using Django signals compared to overriding the save
method.
这是一个例子:
@receiver(post_save, sender=User)
def save_driver_registration(sender, instance, created, **kwargs):
if created:
DriverRegistration.objects.create(user=instance.pk)
在创建新的 User
条目后,这将创建一个新的DriverRegistration对象.可以说,这是比覆盖 .save()
更好的方法,因为在您的实现中,每次您 .save()
用户时(例如-更新用户名/密码))-您将创建一个新的 DriverRegistration
对象.
This will create a new DriverRegistration object when a new User
entry has been created. This is arguably a better approach than overriding .save()
because with your implementation, every time you .save()
a user (for example - updating a user's name/password) - you will create a new DriverRegistration
object.
在此处了解更多信息: https://docs.djangoproject.com/en/3.1/topics/signals/
Read more here: https://docs.djangoproject.com/en/3.1/topics/signals/