我有一个代理模型。
现在我想从其父模型的给定实例转换为代理的实例。
我的经理中有这段代码:
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)
有什么方法可以复制关系外键、缓存或其他东西并完全避免进行任何查询?
我将在几乎每个请求中使用此方法:/
编辑:
这似乎有效:
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
如果有人知道与多对多经理一起这样做是否安全,请发表评论/回答。