无法在迁移中创建对象
Can't create object inside migrations
我正在用我的模型扩展 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-迁移作业,它在所有其他迁移之后进行:
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
的例子!
我完成了迁移工作 - 不确定这是否合法。
无论如何,这是我的智慧。
当您在迁移操作中使用 apps.get_model("<app>", "<Model>")
时,django 似乎导入的不是确切的 <Model>
,而是类似于 .我在阅读 class inside migrations 的 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>")
方法
我正在用我的模型扩展 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-迁移作业,它在所有其他迁移之后进行:
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
的例子!
我完成了迁移工作 - 不确定这是否合法。 无论如何,这是我的智慧。
当您在迁移操作中使用 apps.get_model("<app>", "<Model>")
时,django 似乎导入的不是确切的 <Model>
,而是类似于 .我在阅读 class inside migrations 的 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>")
方法