在复制Django模型对象时,我总是希望它与从中复制的源对象没有相同的标识(即主键)。通常你会这样做:
copy = copy.copy(source)
copy.pk = None
copy.save()
但我想让它自动的像这样:
class MyModel(Model):
def __copy__(self):
result = MyModel.__new__(MyModel)
result.__dict__.update(self.__dict__)
result.pk = None
return result
所以我现在可以做:
copy.copy(my_Model).save()
到目前为止,这似乎是可行的。然而,看看Django对__init__
和__new__
中的模型对象做了什么,我一直想知道这是否确实是允许的,是否符合Django原则。令人惊讶的是,Django模型似乎没有覆盖__copy__
。你知道吗
正如您可以在Django source (^{}) 中找到的,Django只使用
__hash__
方法(它使用pk
)来确定该方法的哈希值。所以它不会与此冲突。你知道吗此外,
__eq__
方法也可以通过pk
进行比较,因此这也无关紧要。你知道吗长话短说,没有什么能阻止您重写
__copy__
,只要您确保pk
值在这个过程中被更改。你知道吗相关问题 更多 >
编程相关推荐