【发布时间】:2016-02-20 03:39:07
【问题描述】:
我有一个 UserProfile 模型,它使用 OneToOneField 引用我的 User 模型。我还使用post_save 信号在创建用户时自动创建UserProfile。除了通过管理员(我使用内联)创建用户时,当我收到有关重复配置文件的错误时,这非常有用。 This answer recommends setting the primary key to be the OneToOneField referring to user.
那么之前:
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL)
# ...
subjects = models.ManyToManyField(Subject, null=True, blank=True)
之后
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True)
# ...
subjects = models.ManyToManyField(Subject, null=True, blank=True)
我正在尝试使用 Django 1.7 中的迁移来做到这一点,但由于配置文件有多个 ManyToManyField,因此生活变得复杂 - 所以它们都引用了 UserProfile 的 id 字段模型。使用 makemigrations 创建迁移以使用户成为主键,并删除旧的 id 字段,但它忽略了 ManyToManyField。
我目前正陷入困境,在迁移中使用大量 RunSQL 语句来修改 ManyToManyField 的直通表。我刚刚遇到另一个错误,其中一个表中的约束名称与另一个表中的不同。
所以我的问题是:在 Django 迁移中是否有一种方法可以完成更改直通表的工作,使其引用新的主键,更新所有约束、键等?如果没有,处理这种情况的最佳方法是什么?
我将 Django 1.7 与 MySQL 一起使用。
【问题讨论】:
-
我会提出解决方案不正确的论点。应修改您的信号以不尝试创建重复的配置文件。主键解决方案对我来说似乎很老套。
-
@Kye - 信号处理程序创建配置文件在管理员内联尝试创建配置文件。因此,信号处理程序必须确定用户是由管理员创建的,以便知道管理员随后会尝试创建用户 - 它不能简单地测试该配置文件是否已存在于数据库中。如果配置文件在创建之前已经存在,另一种方法是让管理员内联测试,但这对我来说感觉很糟糕。
-
@HamishDowner 看起来像是一个错误:code.djangoproject.com/ticket/25012
标签: mysql django django-models django-migrations manytomanyfield