ValueError:字段引用的模型的查找失败

时间:2015-12-30 07:14:40

标签: python django django-models

我在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)

我该怎么办?

谢谢!

1 个答案:

答案 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以了解故障。