【问题标题】:auth.user not resolved error djangoauth.user 未解决错误 django
【发布时间】:2017-10-06 09:33:43
【问题描述】:

我在我的模型中添加了一个字段,并通过外键将其附加到 django 用户模型。

我的模型是:

from django.db import models
from django.contrib.auth.models import User

    # Create your models here.
    class user_files(models.Model):
        Filename = models.CharField(max_length=50)
        Browse = models.FileField()
        Username = models.ForeignKey(User,default=1)

但是在迁移时它给了我错误:

'valueerror: 无法解析相关模型'auth.user'。'

这是什么意思以及如何解决?我尝试了很多东西,但都没有成功。

提前致谢。

【问题讨论】:

  • 该错误并非来自此代码。
  • 首先在models.py中不带任何字段的情况下运行makemigration和migrate命令,然后在models.py中放一些东西后再次运行这些命令
  • 我从模型中删除了所有条目,并从模型中删除了外键列,但仍然是同样的错误。

标签: django django-models django-forms django-templates


【解决方案1】:

您的代码给人的印象是除了已发生的错误之外,您还需要更多帮助。以下是我对如何总体改进代码的建议:

  • 与用户模型建立关系的推荐方法是使用设置 AUTH_USER_MODEL。

  • 按照惯例,类名应采用帕斯卡大小写 (PascalCase) 和单数形式。

  • 变量名,也就是类属性,应该按照约定使用蛇形大小写 (snake_case)。

因此您的代码可以像这样增强:

from django.conf import settings
from django.db import models


class UserFile(models.Model):
    filename = models.CharField(max_length=50)
    browse = models.FileField()
    username = models.ForeignKey(settings.AUTH_USER_MODEL)

命名是一个极其重要的话题。你应该为你的类、方法、属性命名非常有意义。将username 用于外键字段的描述性不是很强。这个变量不保存用户名的值,而是整个用户对象。有一个字段filename 也很混乱,因为FileField 实际上将文件路径和数据库中的文件名保存为字符串(varchar)。

代码编写一次,但读取多次。读者不清楚你的意图。

如果您在迁移此模型后添加字段 username,则您有前两个变体:必填字段或可选字段。

如果应该是可选字段,可以允许NULL

username = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)

然后运行:

python manage.py makemigrations
python manage.py migrate

这是更简单的方法。但如果需要此字段,迁移将需要知道应该为表中的当前条目分配哪个值,并会要求您以交互方式添加默认值。这与将默认值指定为选项不同。

在您的情况下,这意味着未明确指定用户名的所有未来条目都将具有值 1。您真的想要吗?您确定用户表中存在具有此主键的条目吗?

编辑(2017-10-10):

如果您搞砸了迁移,您可以手动清理它。在数据库中有一个表django_migrations,它跟踪所有应用的迁移。它有四列:

-----------------------------
| id | app | name | applied |
-----------------------------

如果您使用 MySQL,您可以使用以下命令检查您的应用程序的迁移:

SELECT * FROM django_migrations WHERE app = 'your_app';

删除此表中的条目以及应用程序的migrations 目录中导致问题的文件。然后重新开始。

【讨论】:

  • 您好,先生,我从模型中删除了所有条目,还从模型中删除了外键列。但是现在在迁移时它说没有检测到更改并且在本地主机上运行时它抛出错误为'没有这样的列:Box_user_files.Username_id'
猜你喜欢
  • 2017-06-27
  • 2011-07-24
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
  • 2021-08-04
  • 2021-06-14
  • 2021-11-22
  • 2016-05-22
相关资源
最近更新 更多