gpt4 book ai didi

python - 复制模型实例和相关模型的更好方法

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

我正在寻找最快、最简单的方法来复制模型实例和相关模型。我发现了一些技巧herehere但我认为它们是基于旧的 django 版本。

我已经用循环实现了它,但是有更好的方法吗?我尝试了django-forkit plugin但遇到一个problem with model that have a foreignkey field with auth.User.

型号:

class Book(Folder):
filename = models.CharField(max_length=255)
created_by = models.ForeignKey(User)

class Chapter(models.Model):
book = models.ForeignKey(Book)
name = models.CharField(max_length=255, db_index=True)

class Page(models.Model):
book = models.ForeignKey(Book)
attribute_value = hstore.DictionaryField(db_index=True)

重复功能:

    book = Book.objects.get(pk=node_id, created_by=request.user)
chapters = Chapter.objects.filter(book=book)
pages = Page.objects.filter(book=book)
book.pk = None
book.id = None
book.filename = book.filename + "_copy"
book.save()
for chapter in chapters:
chapter.book= book
chapter.pk = None
chapter.save()
for page in pages:
page.book= book
page.pk = None
page.save()

最佳答案

如果模型真的那么简单,我会像你拥有的那样保留它。

如果不是,或者如果您想对其进行过度设计;),那么我个人最喜欢的设计模式是显式声明受复制操作影响的字段并循环遍历这些字段。这可以防止您修改模型 API 并(可能)使您的代码不可升级。您的模型还会 self 描述副本中发生的情况,这对于您可能不想翻译的某些领域非常方便。例如:

class CopyableModel(models.Model):
# these fields are persisted across copies
_copy_concerns = ['title', 'author', 'body']

def create_copy(self):
attrs = {}
for concern in self._copy_concerns:
attrs[concern] = getattr(self, concern)

# does this work? Might have to access the CopyableModel definition in a different way...
# Like self.__class__.objects.create( ...
return CopyableModel.objects.create(**attrs)

您可以稍微调整一下它以处理 M2M 和其他关系。同样,不确定在您的特定情况下是否值得这样做,但是当您需要它时,这是一个很好的可扩展模式。

关于python - 复制模型实例和相关模型的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25118854/

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