我正面临着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', '[email protected]', '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', '[email protected]', '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),
]