无法在迁移中创建对象

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

我正在用我的模型扩展django.contrib.auth.User模型:

class Farmer(models.Model):
    user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, related_name="farmer")
    mob_phone = models.CharField(max_length=12)

我想在迁移期间创建其中一些Farmer实例,所以我有一个python-migration作业,该作业将在所有其他迁移之后进行:

def create_farmers(apps, schema_editor):
    db_alias = schema_editor.connection.alias
    Farmer = apps.get_model("farmer", "Farmer")
    User = get_user_model()

    u = User.objects.using(db_alias).create(username="kek" ,password="lol")
    farmer = Farmer.objects.using(db_alias).create(id=1, user=u, mob_phone="1")

我像其他所有迁移一样,在operations部分中运行此作业:

operations = [
    migrations.RunPython(create_farmers, revert_create_farmers),
]

但是Django在用我的脸在笑

ValueError: Cannot assign "<User: kek>": "Farmer.user" must be a "User" instance.

这让我失望了,因为u肯定是User实例!

django django-migrations
1个回答
0
投票

我完成了迁移工作-不知道这是否合法。无论如何,这是我的智慧。

当您在迁移操作中使用apps.get_model("<app>", "<Model>")时,django似乎不导入确切的<Model>,而是类似的导入。在阅读有关迁移内部类的django资源时,我得出了这个结论。在这些来源中,我找到了一个断言,该断言将我的forignKey用户类型与_fake.User类型进行比较。当然是我真正的用户类型django.contrib.auth.models.User_fake.User不同,并且通过该部分不正确的消息进行django:ValueError: Cannot assign "<User: kek>": "Farmer.user" must be a "User" instance.

解决方案是从应用程序导入真实的Farmer模型-不使用apps.get_model("<app>", "<Model>")方法

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