2013-05-09 45 views
0

我有一個代理模型。如何將模型轉換爲其子代理模型的實例

現在我想從其父模型的給定實例轉換爲代理的實例。

我有我的經理這樣的代碼:

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 

如果有誰知道,如果有多對多這樣做管理人員是否安全,請留下評論/回答。

回答

1

查看Django的邏輯之後,我對你的方法只有幾個擔憂。我也使用類似於你正在做的事情,但是我從模擬字段的創建和關聯到新的父模型類的自上而下的方法來解決它。

關注1:

if auto_created: 
    self.creation_counter = Field.auto_creation_counter 
    Field.auto_creation_counter -= 1 
else: 
    self.creation_counter = Field.creation_counter 
    Field.creation_counter += 1 

下面是當一個場被初始化發生這種情況的邏輯,django的遞增上Field類的靜態計數器。據我所看到的,它不應該負的大局觀影響你,這是唯一的靜態參考我能找到在現場的__init__方法

關注2:

def __deepcopy__(self, memodict): 
    # We don't have to deepcopy very much here, since most things are not 
    # intended to be altered after initial creation. 
    obj = copy.copy(self) 
    if self.rel: 
     obj.rel = copy.copy(self.rel) 
    memodict[id(self)] = obj 
    return obj 

這種方法是在Field類中找到的,當字段被深度複製時,它會在關係本身上進行復制。我會傾向於相信,他們已經實現了這種級別的複製,其原因可能是爲了阻止他們在執行類似於您和我正在嘗試添加一些魔法時遇到的任何問題。所以也許不是複製字典,而是執行深層複製,讓django的深層複製實現它所需要的額外魔法。除了這兩個問題之外,我已經成功移動並將字段複製到新的模型類實例,並且我沒有看到「實際」原因,因爲實現它的方式應該引起太多關注。如果由於某種原因,你碰上的關係問題,至少你會知道從哪裏開始:)

編輯

我創建了一個要點,以幫助說明完全實現:https://gist.github.com/bmoyles0117/5604915

+0

感謝您對布萊恩的貢獻。在嘗試獲取並且無法管理時,我首先查看了copy/deepcopy。你的建議究竟是什麼?使用複製/深層複製的字段和many_to_many與2我有類似的循環? – 2013-05-18 13:31:17

+0

我已經爲你創建了一個要點,它顯示了實現深度拷貝的「utils.py」。我總結了一下你的實現,但至少你可以看到我的方法:) – Bryan 2013-05-18 16:05:07

+0

嘿,thx,我已經在要點留下了評論。 – 2013-05-18 16:33:52

相關問題