事實上,如果你想使用諸如dumpdata
和loaddata
命令,例如備份和數據庫中的恢復選擇對象O2O的關係可能很麻煩。
我們的軟件存在類似的問題,我發現可能的工作解決方案是覆蓋django.core.serializers.base.DeserializedObject
上的save()
方法,以便在「double」對象保存之前真正獲得句柄。此時,您可能會決定丟棄由Django創建的默認O2O關係,並讓框架保存新的關係或使用XML或JSON文件中存儲的值更新它。
你不得不把覆蓋方法某處雖然執行loaddata
命令之前Django的回升。一種可能性是創建自己的命令,然後調用loaddata
。在命令模塊中,您安裝覆蓋。關於此解決方案的以下詳細信息是隱含的:
- 經過Django 1.8測試。X
- 我們的O2O領域連接到Django的
User
模型
- 爲了簡化本例中的份上,我會打電話給所連接的O2O領域
Attached
。
# Overrides deserialization to affect OneToOneFields for Users correctly
import django.core.serializers.base
from django.contrib.auth.models import User
from your.attached.models import Attached #model with O2O field to User
_original_save = django.core.serializers.base.DeserializedObject.save
def save(self, *args, **kwargs):
if isinstance(self.object, Attached):
# if the user in question has an attached object, delete it
user = User.objects.get(pk=self.object.user_id)
if hasattr(user, 'attached'): user.attached.delete()
# use the built-in function for all other cases
_original_save(self, *args, **kwargs)
django.core.serializers.base.DeserializedObject.save = save
您可以修改代碼上面,而不是刪除現有對象,更新它,如果你在if hasattr(...)
條款,避免刪除,更新的值來自的現有對象您的序列化對象並跳過致電_original_save()
的呼叫。它會使代碼與模型綁定更多,因爲您可能必須定義要在現有對象上更新哪些字段。上面顯示的解決方案沒有假設模型的內容。
您是否找到了解決方案? –
如果你不得不這樣做,我建議更新django – Alp
不要以爲轉儲數據中會有多個對象或多次創建。你能告訴我們什麼轉儲數據給你?還有loaddata的錯誤? – Rohan