如何将用户分配到我的数据库中的模型
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 修复:
- 现在提供一次性默认值(将在所有现有行上设置此列的空值)
- 退出并在models.py中手动定义一个默认值。
Select一个选项:
我该怎么做
您可以使用 python shell
• python manage.py shell
手动添加用户,然后导入所需的模型。
阅读类似问题的更多内容here:
如何使用python shell
也许可以将 UUID 添加到您的用户模型,并使其他模型中需要用户的字段成为存储用户 UUID 的 CharField。
因为你已经添加了 non-nullable 字段 user
到 Blog
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 默认添加 user
s 到 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.
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 修复:
- 现在提供一次性默认值(将在所有现有行上设置此列的空值)
- 退出并在models.py中手动定义一个默认值。
Select一个选项:
我该怎么做
您可以使用 python shell
• python manage.py shell
手动添加用户,然后导入所需的模型。
阅读类似问题的更多内容here:
如何使用python shell
也许可以将 UUID 添加到您的用户模型,并使其他模型中需要用户的字段成为存储用户 UUID 的 CharField。
因为你已经添加了 non-nullable 字段 user
到 Blog
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 默认添加 user
s 到 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.