如何将用户分配到我的数据库中的模型

How to assign a user to a model in my database

    from django.db import models
    from datetime import datetime
    from django.contrib.auth import get_user_model

    User = get_user_model()


    class Blog(models.Model): 
        user = models.ForeignKey(User, on_delete=models.CASCADE)
        headline = models.CharField(max_length=250)
        content = models.CharField(max_length=2050)
        time_created = models.DateTimeField(default=datetime.now, blank=True)

        def __str__(self):
            return self.user.username

每次我迁移这个

"(venv) PS C:\Users\user\Desktop\APPS\web_app_project> python manage.py makemigrations"

我总是收到这条消息:

“如果不指定默认值,就不可能向博客添加不可为空的字段 'user'。这是因为数据库需要一些东西来填充现有的行。 请 select 修复:

  1. 现在提供一次性默认值(将在所有现有行上设置此列的空值)
  2. 退出并在models.py中手动定义一个默认值。

Select一个选项:

我该怎么做

您可以使用 python shellpython manage.py shell 手动添加用户,然后导入所需的模型。

也许可以将 UUID 添加到您的用户模型,并使其他模型中需要用户的字段成为存储用户 UUID 的 CharField。

因为你已经添加了 non-nullable 字段 userBlog Django 需要添加一个用户到 all 中的博客实例数据库,包括新的和现有的。如果您在数据库中创建了一个博客实例,Django 应该如何处理它的新用户列?这就是它要问你的。

只有当数据库中没有数据或者您完全可以丢失数据时,您可以将您的应用程序迁移到零使用 python manage.py migrate <your app name> zero(除了 zero 之外,您可能还想反向迁移。您可以 read more about reverse migrations)。这将有效地撤消该应用程序的所有迁移。然后,您可以删除该应用程序的现有迁移,然后再次 运行 makemigrations。 Django 将不再抱怨 non-nullable 字段 user,因为这会导致迁移 creates a Blog table with a user 字段,而不是尝试将 user 字段添加到 现有 Blog table 的迁移。再一次,不要这样做,除非您可以接受丢失数据。 如果您的应用已经 运行,则 永远不要 这样做宁在生产中,但如果您从未部署过该应用程序并且没有“真实”数据并且您仍处于初始开发阶段,那也没关系。另外,请确保您有已删除迁移的备份,以防您需要将它们添加回来。

正如其他人所建议的,您可以创建一个默认用户模型,用作 one-time 默认添加 users 到 Blogs。例如(在 Django shell)

from django.contrib.auth import get_user_model

User = get_user_model()
user = User(username='default_blog_user')
user.set_unusable_password() # Nobody should be able to log in as this user
user.save()
print(user.id) # keep this ID

然后,在迁移中,您可以使用任何 user.id 值作为 one-time-默认值。但这再次假设您尚未部署到生产环境,因为 one-time-default 以及开发和生产中的 ID 可能不匹配。

如果您已经部署到生产环境,我认为您唯一能做的就是为了迁移将用户字段设置为空,但断言它 不是 在您的编程逻辑中为 null。例如,通过 adding a validator to the field.


旁注:在你的 models 模块中不要 运行ning get_user_model,你应该这样做:

from django.conf import settings

class Blog(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    # etc.

When you define a foreign key or many-to-many relations to the user model, you should specify the custom model using the AUTH_USER_MODEL setting.

source