我有一個UserProfile
模型,該模型引用了我的User
模型並使用OneToOneField
。在創建用戶時,我也使用post_save
信號自動創建UserProfile
。當我得到一個關於重複配置文件的錯誤時,除了通過管理員創建用戶(我使用內聯)之外,這很有效。 This answer recommends setting the primary key to be the OneToOneField referring to user。如何使用ManyToManyField編寫遷移以更改模型的主鍵
所以前:
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看起來像它的一個bug:https://code.djangoproject.com/ticket/25012 – Anupam