我有一個代理模型。如何將模型轉換爲其子代理模型的實例
現在我想從其父模型的給定實例轉換爲代理的實例。
我有我的經理這樣的代碼:
def from_parent_user(self, user):
instance = Member()
single_fields = self.model._meta.fields
for field in single_fields:
setattr(instance, field.name, getattr(user, field.name))
multiple_fields = self.model._meta.many_to_many
for field in multiple_fields:
setattr(instance, field.name, getattr(user, field.name).all())
return instance
這工作,但複製多對多字段時賺了很多的查詢。 所以它甚至不如簡單地做這樣的:
def from_parent_user(self, user):
return self.get(pk=user.pk)
任何方式複製關係foreing鍵,高速緩存或東西,避免作出任何查詢呢?
我會在幾乎每一個請求使用這種方法:/
編輯:
這似乎是工作:
def from_parent_user(self, user):
member = Member()
single_fields = self.model._meta.fields
for field in single_fields:
setattr(member, field.name, getattr(user, field.name))
multiple_fields = self.model._meta.many_to_many
for field in multiple_fields:
# doing this scares me, I don't know if it is safe:
getattr(member, field.name).__dict__.update(getattr(user, field.name).__dict__)
return member
如果有誰知道,如果有多對多這樣做管理人員是否安全,請留下評論/回答。
感謝您對布萊恩的貢獻。在嘗試獲取並且無法管理時,我首先查看了copy/deepcopy。你的建議究竟是什麼?使用複製/深層複製的字段和many_to_many與2我有類似的循環? – 2013-05-18 13:31:17
我已經爲你創建了一個要點,它顯示了實現深度拷貝的「utils.py」。我總結了一下你的實現,但至少你可以看到我的方法:) – Bryan 2013-05-18 16:05:07
嘿,thx,我已經在要點留下了評論。 – 2013-05-18 16:33:52