python - 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)
解决方案
就实现而言 - 我认为与覆盖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/
推荐阅读
- objective-c - 使用更新的值搜索和修改 NSMutableArray 对象
- reactjs - 如何在应用引擎 flex 上将 HSTS 标头添加到我的 nginx / react 应用?
- emacs - 如何使用图标或面孔自定义 org-agenda-write 输出?
- html - 使用 CSS 来适应 HTML 网站的所有元素的最佳方式是什么?
- javascript - 我可以访问 ES6 模块中的全局 ES5 变量吗?
- sql - 如何将学生分成3组?
- python - 键错误:'begins_at'
- visual-studio - Visual Studio - 创建一个项目模板,该模板显示在解决方案的“添加新项目”对话框中
- asp.net - 无法在 VISUAL STUDIO 中编辑和继续 ASP.NET
- alexa - Alexa 技能失败 LAMBDA - 请求的技能响应有问题