gpt4 book ai didi

python - 值错误 : Cannot assign User: issue on my OneToOneField relationship

转载 作者:太空狗 更新时间:2023-10-30 01:01:06 28 4
gpt4 key购买 nike

我在使用 OneToOneField 时遇到了一个非常奇怪的问题。我有一个非常简单的模型,比如

class Doctor(models.Model):
user = models.OneToOneField(User)

问题出在我的方法上 RunPython在迁移中。我写了一个依赖于 0001_initial 的 0002_addusers 迁移,代码如下:

class Migration(migrations.Migration):
def create_users(apps, schema_editor):
u = User.objects.create_superuser('admin', 'admin@aaa.com', 'admin')
u.save()

du = User.objects.create_user(username='doc01', password='doc01')
du.save()

def create_doctors(apps, schema_editor):
Doctor = apps.get_model('custom_user', 'Doctor')
du = User.objects.get(username='doc01')

d = Doctor(user=du)
d.save()

dependencies = [
('custom_user', '0001_initial')
]

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

对我来说真正奇怪的是,这个非常简单的代码在 View 中工作,在 shell 中工作,在除了迁移之外的任何地方工作:)

回溯如下:

line 23, in create_doctors
d = Doctor(user=du)
...
ValueError: Cannot assign "<User: doc01>": "Doctor.user" must be a "User" instance.

非常感谢您的支持!

编辑:我找到了解决方案。我只需要调用 RunPython

migrations.RunPython(create_users, create_doctor)

作为Avinash即使不将函数移到类外也建议。

似乎后续函数必须作为单个 RunPython 调用的参数来调用。

最佳答案

运行 migrations.RunPython(create_users, create_doctor) 的建议答案并不能解决您的问题,它只是让它不可见。

RunPython 的第二个参数是将在回滚期间调用的函数,这就是为什么它在向上迁移时没有引发任何异常的原因。您从未调用函数 create_doctors

您的问题是由于 du 不是 User 实例引起的。当不使用 apps.get_model 获取模型类时,这可能在迁移中引起。您应该改用以下代码:

class Migration(migrations.Migration):
def create_users(apps, schema_editor):
User = apps.get_model('auth', 'User') # Here you get the user programatically, it is a good practise in migrations
u = User.objects.create_superuser('admin', 'admin@aaa.com', 'admin')
u.save()

du = User.objects.create_user(username='doc01', password='doc01')
du.save()

def create_doctors(apps, schema_editor):
Doctor = apps.get_model('custom_user', 'Doctor')
User = apps.get_model('auth', 'User') # Here you get the user programatically, it is a good practise in migrations
du = User.objects.get(username='doc01')

d = Doctor(user=du)
d.save()

dependencies = [
('custom_user', '0001_initial')
]

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

关于python - 值错误 : Cannot assign User: issue on my OneToOneField relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29700001/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com