【问题标题】:Users as foreign key in Django用户作为 Django 中的外键
【发布时间】:2018-07-04 03:49:46
【问题描述】:

我的 models.py 文件中有以下内容:

class Film(models.Model):
    title = models.CharField(max_length=200)
    director = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    pub_date = models.DateField('date published')

class Comment(models.Model):
    film = models.ForeignKey(Film, on_delete=models.CASCADE)
    body = models.CharField(max_length=200)

当我登录 Django admin 时,我添加了一些电影,然后添加了一些 cmets,选择与评论相关的电影对象。然后我还通过管理面板创建了几个用户。

我希望我的人际关系是:

电影可以有多个 cmets / 评论属于电影

用户可以有多个 cmets / Comments 属于用户

我认为,就像 cmets 和电影一样,我只需要将 user 定义为 comment 的外键。我正在努力做到这一点。我正在处理Django tutorials,但我看不到有关如何将其他表链接到用户的教程。

我认为我可以做这样的事情:

user = models.ForeignKey(User, on_delete=models.CASCADE)

像这样导入用户时:

from django.contrib.auth.models import User

目前的结果是,如果我保留user = models.ForeignKey(User, on_delete=models.CASCADE),我会得到 err_connection_refused

【问题讨论】:

  • 你可以看到这个问题link,也许对你有帮助。
  • err_connection_refused 错误与外键无关。这意味着 Django 无法连接到数据库。
  • 您是否更改了设置中的默认用户模型?而不是直接在外键中使用用户,你应该使用user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
  • @kichik 我有一些缩进错误要修复。谢谢
  • @AngelF 与from django.conf import settings 一起添加有帮助。但是,当我在选择与新评论相关的电影和用户时尝试添加新评论时,我得到“表films_comment 没有名为user_id 的列”。我需要像我有FilmComment 一样将它添加到models.py 吗?还是我当前的代码不够用?我以为我在class Comment 下定义了这个

标签: python django


【解决方案1】:

也许您在设置中更改了默认用户模型?

您应该在评论模型中使用user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE),而不是直接将User 与外键一起使用,如下所示

class Comment(models.Model):
    film = models.ForeignKey(Film, on_delete=models.CASCADE)
    body = models.CharField(max_length=200)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

您需要应用迁移才能将用户添加到评论中, python manage.py makemigrations python manage.py migrate

如果您正在应用迁移,shell 会显示一条消息,告诉 您正在尝试添加一个不可为空的字段“用户”以在没有默认值的情况下进行评论

您有 2 个选项

  1. 跳过迁移并向模型中的字段添加默认值或将属性设置为可为空,无论您需要什么 即

user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)

并再次应用迁移

  1. 或者为新字段选择一个默认值,应该是数据库中现有用户的id

这是因为 django 应该填充数据库中的现有记录(如果存在)

【讨论】:

  • 非常感谢@Angel F 抽出宝贵时间。我添加了一个默认值,它按预期工作。
  • 记得导入from django.conf import settings
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 2014-09-07
  • 1970-01-01
  • 2014-10-02
  • 2020-07-12
  • 1970-01-01
  • 2016-04-02
  • 2020-05-20
相关资源
最近更新 更多