我使用 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)
这失败了,因为那时,信号处理程序尝试使用 O2O创建一个指向历史的新 指针:UserDetails
User
ValueError: Cannot assign "<User: User object>": "UserDetails.user" must be a "User" instance.
真可惜。
好的,我可以直接调用信号处理程序。但是我必须在关键字参数中传递历史UserDetails
类(以及它需要的其他历史类)。此外,具有 的应用程序UserDetails
不是具有此数据迁移的应用程序,因此这将是一个丑陋的依赖关系,很容易破坏,例如,如果UserDetails
应用程序从INSTALLED_APPS
.
那么,这仅仅是我必须用丑陋的代码和 FixMe 注释来解决的当前限制吗?或者有没有办法从数据迁移中发送信号?