Django 2.1如何在迁移中创建用户

Ben*_*Ben 5 django django-migrations

我正在尝试添加新用户,然后将其与现有记录的子集关联。

例如,假设我有这个应用程序模型:

class Foo(Model):
    user = model.ForeignKey(User, default=None, on_delete=models.CASCADE)
Run Code Online (Sandbox Code Playgroud)

在迁移中,我有:

from django.contrib.auth.models import User    

def add_user(apps, schema_editor):
    anon = User.objects.create_user(username='anonymous')
    anon.save()

    Foo = apps.get_model('myapp', 'Foo')
    foo_to_change = Foo.objects.filter(user_id=1)

    for f in foo_to_change:
        f.user = anon
        f.save()    
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到这个错误:

ValueError: Cannot assign "<User: anonymous>": "Foo.user" must be a "User" instance.
Run Code Online (Sandbox Code Playgroud)

我认为问题可能出在我直接使用User模型,而文档说不这样做。因此,我将顶部更改为:

User = apps.get_model('auth', 'User')
anon = User.objects.create_user(username='anonymous')
anon.save()
Run Code Online (Sandbox Code Playgroud)

现在我得到了另一个错误:

AttributeError: type object 'User' has no attribute 'normalize_username'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何在数据迁移中添加新用户?

编辑:我正在使用sqlite作为数据库

tri*_*het 6

您可以执行以下操作:

def add_user(apps, schema_editor): 
    apps.get_model('myapp', 'Foo').objects.filter(user_id=1).update(
        user=apps.get_model('auth', 'User').objects.create_user(username='anonymous')
    )
Run Code Online (Sandbox Code Playgroud)

之所以可行,是因为在这种情况下,“不检查任何类型”,查询将使用对数据库中条目的引用:用户ID。

  • 应使用“create”而不是“creater_user”,因为后者将触发“UserManager”验证,而该验证在迁移期间不可用。 (2认同)