gpt4 book ai didi

python - 如何将模型转换为其后代代理模型的实例

转载 作者:太空宇宙 更新时间:2023-11-03 18:59:09 25 4
gpt4 key购买 nike

我有一个代理模型。

现在我想从其父模型的给定实例转换为代理的实例。

我的经理中有以下代码:

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

如果有人知道与多对多经理一起这样做是否安全,请留下评论/答案。

最佳答案

在查看了 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 类上的静态计数器。据我所知,从大局来看,它不会对您产生负面影响,这是我在 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

关于python - 如何将模型转换为其后代代理模型的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16472542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com