OneToOneField我面临一个非常奇怪的问题.我有一个非常简单的模型
class Doctor(models.Model):
user = models.OneToOneField(User)
Run Code Online (Sandbox Code Playgroud)
问题在于迁移中的方法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),
]
Run Code Online (Sandbox Code Playgroud)
对我来说真正奇怪的是,这个非常简单的代码在视图中工作,在shell中工作,除了在迁移中工作在任何地方:)
追溯如下:
line 23, in create_doctors
d = Doctor(user=du)
...
ValueError: Cannot assign "<User: doc01>": "Doctor.user" must be a "User" instance.
Run Code Online (Sandbox Code Playgroud)
非常感谢您的支持!
编辑: 我找到了解决方案.我只需要调用RunPython
migrations.RunPython(create_users,create_doctor)
正如Avinash所建议的那样,即使没有在课堂外移动功能.
似乎后续函数必须作为单个RunPython调用的参数调用.
我认为问题出在您的迁移代码中。在 Migration 类外部定义方法,然后从迁移的 RunPython 命令调用它。
在迁移文件中尝试以下代码。这会起作用。
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')
# We can't import the Doctor model directly, But we can create it. Try this -
Doctor.objects.create(user=du)
class Migration(migrations.Migration):
dependencies = [
('custom_user', '0001_initial')
]
operations = [
migrations.RunPython(create_users, create_doctors),
]
Run Code Online (Sandbox Code Playgroud)