我有一个代理模型。如何将模型转换为其子代理模型的实例
现在我想从其父模型的给定实例转换为代理的实例。
我有我的经理这样的代码:
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