【发布时间】:2014-12-19 23:29:15
【问题描述】:
我使用 Django 1.7 迁移,特别是希望使用初始数据填充新创建的数据库。因此,我为此使用了数据迁移。它看起来像这样:
def populate_with_initial_data(apps, schema_editor):
User = apps.get_model("auth", "User")
new_user = User.objects.create(username="nobody")
class Migration(migrations.Migration):
...
operations = [
migrations.RunPython(populate_with_initial_data),
]
同时,我想为每个新用户创建一个UserDetails 模型实例:
@receiver(signals.post_save, sender=django.contrib.auth.models.User)
def add_user_details(sender, instance, created, **kwargs):
if created:
my_app.UserDetails.objects.create(user=instance)
但是:这个信号只在迁移之外起作用。原因是apps.get_model("auth", "User") 与django.contrib.auth.models.User 足够不同,以至于没有发送信号。如果我尝试像这样手动执行此操作,则会失败:
signals.post_save.send(django.contrib.auth.models.User, instance=julia, created=True)
这失败了,因为信号处理程序尝试创建一个新的 UserDetails 以 O2O 指向 历史 User:
ValueError: Cannot assign "<User: User object>": "UserDetails.user" must be a "User" instance.
无赖。
好的,我可以直接调用信号处理程序。但是我必须在关键字参数中传递历史 UserDetails 类(以及它需要的其他历史类)。此外,带有UserDetails 的应用程序不是具有此数据迁移的应用程序,因此这将是一个丑陋的依赖关系,很容易破坏,例如如果从INSTALLED_APPS 中删除了UserDetails 应用程序。
那么,这仅仅是我必须用丑陋的代码和 FixMe 注释来解决的当前限制吗?或者有没有办法从数据迁移中发送信号?
【问题讨论】:
-
您找到解决方法了吗?
-
是的,使用signal.post_migrate 因为这个被调用了。但它仍然需要不需要的代码。
-
您应该发布答案并接受您自己的答案,因为这个问题位于未回答的 django 问题的顶部。
标签: django data-migration django-signals django-migrations