我在Django项目中制作了自定义用户模型。这是:
class CustomUser(User):
avatar = models.ImageField(upload_to='avatars')
about_myself = models.TextField(max_length=300)
USERNAME_FIELD = 'username'
def __str__(self):
return self.username
def is_author(self):
return 'blog.change_post' and 'blog.add_post' in self.get_all_permissions()
之后,我将用户的所有外键更改为新的CustomUser模型。它运作正常。但是当我想要迁移它时,我做了一个新的迁移和django导致错误:
ValueError: Lookup failed for model referenced by field blog.Comment.author: main.CustomUser
我的博客。评论模特:
class Comment(models.Model):
content = models.TextField()
author = models.ForeignKey(CustomUser)
date_create = models.DateTimeField(auto_now_add=True)
post = models.ForeignKey(Post)
我该怎么办?
谢谢!
答案 0 :(得分:1)
从您发布的代码判断,通过扩展用户模型而不是替换它可能会更好。此模式通常称为配置文件模型,并通过与用户的一对一关系工作。
配置文件提供特定于应用程序的字段和行为,同时允许用户将其常规业务保持不变。它不需要你重写auth甚至更改你的外键。
以下是您作为个人资料编写的代码示例:
class Profile(models.Model):
# Link to user :
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
avatar = models.ImageField(upload_to='avatars')
about_myself = models.TextField(max_length=300)
def __str__(self):
return self.user.username
def is_author(self):
return 'blog.change_post' and 'blog.add_post' in self.user.get_all_permissions()
评论模型:
class Comment(models.Model):
content = models.TextField()
author = models.ForeignKey(settings.AUTH_USER_MODEL)
date_create = models.DateTimeField(auto_now_add=True)
post = models.ForeignKey(Post)
# How to access the profile:
def check_author(self):
self.author.profile.is_author()
您还需要添加信号以在用户注册时创建新的配置文件:
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_profile_for_new_user(sender, created, instance, **kwargs):
if created:
profile = Profile(user=instance)
profile.save()
Django docs on extending users
如果配置文件方法不适合您,请尝试继承AbstractUser或AbstractBaseUser而不是User。抽象模型提供与User相同的基本功能,是最近Django版本的首选技术。
然而,还有一些额外的步骤,请查看docs on creating custom users以了解故障。