我遇到过很多场景需要调整我的models.py文件以避免循环依赖。
这是最新的例子。我有registration / models.py,看起来像这样(为了简单起见,我删除了绝大多数代码):
from user_profile.models import UserProfile
class UserManager(BaseUserManager):
@transaction.atomic() # We definitely do not want to create a User record without a UserProfile
def _create_user(self, email, **kwargs):
user_profile = UserProfile.objects.create_user_profile(first_name, last_name)
email = self.normalize_email(email)
user = self.model(email=email,
**kwargs
)
user.set_password(password)
user.save()
return user
class User(AbstractBaseUser, PermissionsMixin, TimeStampedModel):
email = models.EmailField('email address',
max_length=user_model_settings.get('EMAIL_MAX_LENGTH'),
unique=True,
blank=False
)
user_profile = models.OneToOneField(UserProfile,
null=False,
)
我后来才知道UserProfile模型(在user_profile.models.py中定义)应该指向User,而不是它当前的方式。
(最初,我在用户模型中有一个链接到图片模型的profile_picture列。我注意到,每当我删除图片记录时,用户记录就开始消失。这是由于级联删除。我将外键翻转,以便图片指向用户,并希望使用UserProfile执行相同的操作。)
不幸的是,如果user_profile / models.py导入registration / models.py,那么registration / models.py就无法再导入user_profle / models.py,因此无法再使用UserProfile管理器在其管理器中创建UserProfile记录
我知道这两个模型紧密耦合......它们应该只是在同一个应用程序中吗?如何防止此类问题。我已经看到第三方框架将他们的经理拆分成单独的文件,但如果我这样做,我仍会遇到同样的问题。我该如何解决这个问题?
我想我只需要一点指导。我对大型应用程序的经验很少,而且之前不必以复杂的方式管理依赖项。
谢谢你的帮助, 尼克
编辑:我应该注意,我知道我可以通过在_create_user函数中导入user_profile.models来解决所有这些问题,但据我所知,这是不好的做法。