当前位置: 首页 > 面试题库 >

在Django中复制模型实例及其相关对象/用于可复制对象的算法

姬雪松
2023-03-14
问题内容

我已经为模型Books,ChaptersPages。它们全部由编写User:

from django.db import models

class Book(models.Model)
    author = models.ForeignKey('auth.User')

class Chapter(models.Model)
    author = models.ForeignKey('auth.User')
    book = models.ForeignKey(Book)

class Page(models.Model)
    author = models.ForeignKey('auth.User')
    book = models.ForeignKey(Book)
    chapter = models.ForeignKey(Chapter)

我想做的就是复制一个现有的Book并更新User给其他人。皱纹是我也想复制所有相关模型实例的Book-它所有的ChaptersPages以及!

观察时,事情变得非常棘手Page-不仅Pages需要author更新其字段,而且还需要指向新Chapter对象!

Django是否支持开箱即用的方式?用于复制模型的通用算法是什么样的?


问题答案:

由于删除了CollectedObjects,因此它在Django 1.3中不再起作用。参见变更集14507

我在Django片段上发布了我的解决方案。它很大程度上取决于django.db.models.query.CollectedObject用于删除对象的代码:

from django.db.models.query import CollectedObjects
from django.db.models.fields.related import ForeignKey

def duplicate(obj, value, field):
    """
    Duplicate all related objects of `obj` setting
    `field` to `value`. If one of the duplicate
    objects has an FK to another duplicate object
    update that as well. Return the duplicate copy
    of `obj`.  
    """
    collected_objs = CollectedObjects()
    obj._collect_sub_objects(collected_objs)
    related_models = collected_objs.keys()
    root_obj = None
    # Traverse the related models in reverse deletion order.    
    for model in reversed(related_models):
        # Find all FKs on `model` that point to a `related_model`.
        fks = []
        for f in model._meta.fields:
            if isinstance(f, ForeignKey) and f.rel.to in related_models:
                fks.append(f)
        # Replace each `sub_obj` with a duplicate.
        sub_obj = collected_objs[model]
        for pk_val, obj in sub_obj.iteritems():
            for fk in fks:
                fk_value = getattr(obj, "%s_id" % fk.name)
                # If this FK has been duplicated then point to the duplicate.
                if fk_value in collected_objs[fk.rel.to]:
                    dupe_obj = collected_objs[fk.rel.to][fk_value]
                    setattr(obj, fk.name, dupe_obj)
            # Duplicate the object and save it.
            obj.id = None
            setattr(obj, field, value)
            obj.save()
            if root_obj is None:
                root_obj = obj
    return root_obj


 类似资料:
  • 通过拖动来复制对象 1选择一个或多个对象。 2选择 “选择 ”、 “直接选择 ”或 “编组选择 ”工具。 3按住 Alt 键 (Windows) 或 Option 键 (Mac OS) 并拖动所选对象(而非定界框上的手柄)。 使用图层面板复制对象 使用 “图层 ”面板可快速复制对象、组和整个图层。 1在 “图层 ”面板中选择要复制的项目。 2执行下列操作之一: 从 “图层 ”面板菜单中选择 “复制

  • 我了解到,当您在Java中修改变量时,它不会改变它所基于的变量 我对对象也假设了类似的情况。考虑一下这个类。 在我试过这个代码后,我搞糊涂了。

  • 本文向大家介绍C++对象的浅复制和深复制详解及简单实例,包括了C++对象的浅复制和深复制详解及简单实例的使用技巧和注意事项,需要的朋友参考一下 C++对象的浅复制和深复制详解及简单实例 浅复制:两个对象复制完成后共享某些资源(内存),其中一个对象的销毁会影响另一个对象 深复制:两个对象复制完成后不会共享任何资源,其中一个对象的销毁不会影响另一个对象 下面我们来看一段代码,以便直观的理解: 这段程序

  • 本文向大家介绍js对象的复制继承实例,包括了js对象的复制继承实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js对象的复制继承。分享给大家供大家参考。具体如下: 希望本文所述对大家的javascript程序设计有所帮助。

  • 问题内容: 我了解到,当您在Java中修改变量时,它不会更改它所基于的变量 我为对象假设了类似的事情。考虑这个课程。 在尝试了这段代码后,我感到困惑。 请向我解释为什么更改任何一个对象都会影响另一个对象。我知道变量文本的值存储在两个对象的内存中的相同位置。 为什么变量的值是独立的却与对象相关? 另外,如果简单分配不能完成工作,如何复制SomeObject? 问题答案: Java中的每个变量都是一个

  • 本文向大家介绍php5对象复制、clone、浅复制与深复制实例详解,包括了php5对象复制、clone、浅复制与深复制实例详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php5对象复制、clone、浅复制与深复制。分享给大家供大家参考,具体如下: 对象复制的由来 为什么对象会有“复制”这个概念,这与PHP5中对象的传值方式是密切相关的,让我们看看下面这段简单的代码 PHP代码 这段代