如何使用 Django 中的自定义用户关系创建*工作*数据迁移?

问题描述 投票:0回答:1

我刚刚开始一个新项目,并且正在使用自定义用户模型(来自

django-authtools
)。一切都很完美,直到我厌倦了在擦除数据库后不断创建示例数据,并决定添加数据迁移以用于开发目的。请注意,我特别不想为此使用固定装置。

我有一个引用

ContactPerson
settings.AUTH_USER_MODEL
模型,并且我在迁移中使用
apps.get_model()
调用。一切都按书本(或者看起来是这样):

# clients/models.py
...

class Client(models.Model):
    name = models.CharField(max_length=128)

class ContactPerson(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="as_contact_person",
    )

# migration
from django.contrib.auth import get_user_model
from django.db import migrations

def create_example_data(apps, schema_editor):
    Client = apps.get_model("clients", "Client")
    ContactPerson = apps.get_model("clients", "ContactPerson")
    User = get_user_model()

    jim_user = User.objects.create_user(
        email="[email protected]", password="*", name="Jim Halpert"
    )
    dunder_mifflin = Client.objects.create(
        name="Dunder Mifflin, Inc.",
    )
    ContactPerson.objects.create(
        client=dunder_mifflin,
        user=jim_user,
    )

class Migration(migrations.Migration):
    dependencies = [
        ("clients", "0001_initial"),
    ]

    operations = [
        migrations.RunPython(create_example_data)
    ]

但是尝试运行迁移时出现此错误:

ValueError:无法分配“”:“ContactPerson.user”必须是“User”实例。

其他迁移是新鲜的,并且从未使用过内置的用户模型。我还检查了迁移中的用户模型是否属于正确的类。

这让我发疯,因为我已经不知道如何调试/修复这个问题并继续该项目了。在控制台中使用完全相同的代码可以正常工作。我该怎么做才能最终解决这个问题并进行数据迁移?

django migration django-migrations data-migration django-custom-user
1个回答
0
投票

经过更多实验,我终于解决了这个问题。

事实证明,您无法创建 User,然后在同一迁移中引用它,并且您必须使用不同的方法来获取 User 模型(!)

我所做的是将数据迁移分为两部分:首先在一个函数中创建用户,然后在另一个函数中创建 ContactPerson:

# migration

from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import migrations


def create_users(apps, schema_editor):
    User = get_user_model()  # IMPORTANT!

    User.objects.create_user(
        email="[email protected]", password="*", name="Jim Halpert"
    )

def create_contacts(apps, schema_editor):
    Client = apps.get_model("clients", "Client")
    ContactPerson = apps.get_model("clients", "ContactPerson")
    User = apps.get_model(settings.AUTH_USER_MODEL)  # IMPORTANT!

    jim_user = User.objects.get(email="[email protected]")
    dunder_mifflin = Client.objects.create(
        name="Dunder Mifflin, Inc.",
    )
    ContactPerson.objects.create(
        client=dunder_mifflin,
        user=jim_user,
    )

class Migration(migrations.Migration):
    dependencies = [
        ("clients", "0001_initial"),
    ]

    operations = [
        migrations.RunPython(create_users),
        migrations.RunPython(create_contacts),
    ]

...这就像魅力一样。

在 Stack 上发布问题确实有帮助:D

© www.soinside.com 2019 - 2024. All rights reserved.