只是想知道是否有一种简单的方法来添加复制管理界面中现有列表的功能?
在数据输入中,我们遇到了许多项目与另一项共享通用数据的情况,为了节省时间,快速复制现有列表并仅更改已更改的数据将非常好.使用更好的模型结构将是减少数据重复的一种方法,但可能存在需要在将来单独更改重复数据的情况.
我正在做一个视图从模型中删除(使用Django的通用视图DeleteView)一个实例,但它从其他模型级联并删除实例:
url(r'^person/(?P<pk>\d+)/delete/$', login_required(DeleteView.as_view(model=Person, success_url='/person/', template_name='delete.html')), name='person_delete'),
Run Code Online (Sandbox Code Playgroud)
我想要做的是显示将被删除的相关项目列表,如管理界面所做的那样,如:
Are you sure you are going to delete Person NAMEOFTHEPERSON?
By deleting it, you are also going to delete:
CLASSNAME1: CLASSOBJECT1 ; CLASSNAME2: CLASSOBJECT2 ; CLASSNAME3: CLASSOBJECT3 ; etc
Run Code Online (Sandbox Code Playgroud) 我想警告或阻止用户删除其他实例引用的对象实例.有一个很好的方法来做到这一点?
一种方法是获得包含指示物的模型列表,然后尝试对它们进行反向查找.有没有办法获得模型列表?或者,还有更好的方法?
在调查收集器建议时,我发现了一些相关信息,并编写了以下内容,查找具有指示对象作为外键的类:
def find_related(cl, app):
"""Find all classes which are related to the class cl (in app) by
having it as a foreign key."""
from django.db import models
all_models = models.get_models()
ci_model = models.get_model(app, cl)
for a_model in all_models:
for f in a_model._meta.fields:
if isinstance(f, ForeignKey) and (f.rel.to == ci_model):
print a_model.__name__
Run Code Online (Sandbox Code Playgroud)
根据建议使用收集中的代码:
def find_related(instance):
"""Find all objects which are related to instance."""
for related in instance._meta.get_all_related_objects():
acc_name = related.get_accessor_name()
referers = getattr(instance, acc_name).all()
if referers:
print related
Run Code Online (Sandbox Code Playgroud) 我有以下代码,它将一个现有实例复制并“归档”到另一个模型中,然后删除它,并用草稿副本替换它。
当前代码
def archive_calc(self, rev_num, primary_field):
model_a = Calc.objects.get(tag_number__tag_number = primary_field, revision_number = rev_num) #Current Revision instance
model_b = CalcArchive() #Draft instance
#Copies data to archive model
for field in model_a._meta.fields:
setattr(model_b, field.name, getattr(model_a, field.name))
model_b.pk = None
model_b.current_revision = False
model_b.save()
model_a.delete()
Run Code Online (Sandbox Code Playgroud)
效果很好,但是我需要更改系统以允许某些带有外键的模型,因为当实例被存档/删除时,相关记录也随之删除。因此,解决此问题的想法是将草稿记录中的更改复制到先前的记录中,然后删除草稿,从而维护与外键相关的记录。
解决思路
def archive_calc(self, rev_num, primary_field):
model_a = Calc.objects.get(tag_number__tag_number = primary_field, revision_number = rev_num) #Current Revision instance
model_b = CalcArchive() #Archive Instance
model_c = Calc.objects.get(pk = self.object.pk) #Draft instance
#Copies data to archive model
for field in …Run Code Online (Sandbox Code Playgroud) 使用Django 1.9 和 Python 3.4,我想复制现有模型实例及其所有相关数据。以下是我目前如何实现这一目标的示例。我的问题是,有没有更好的方法?
我已经阅读了一些帖子,例如在 Django / Algorithm 中复制模型实例及其相关对象,用于重复复制一个对象,但是,它们已经超过 8 年了,不再与 Django 1.9+ 一起使用。
下面是我如何尝试在 Django 1.9 中实现这一点,好的还是更好的方法?
楷模
class Book(models.Model):
name = models.CharField(max_length=80)
class Contributor(models.Model):
name = models.CharField(max_length=80)
books = models.ForeignKey("Book", related_name="contributors")
Run Code Online (Sandbox Code Playgroud)
复制功能。我必须在保存新的 Book 实例后重新创建贡献者,否则,它将从我正在复制的实例中分配现有的贡献者。
def copy_book(self, id):
view = self.context['view']
book_id = id
book = Book.objects.get(pk=book_id)
copy_book_contributors = book.contributors.all()
book.id = None
# make a copy of the contributors items.
book.save()
for item in copy_book_contributors:
# We need to copy/save the …Run Code Online (Sandbox Code Playgroud) 以前,当我想递归克隆对象时遇到问题。我知道克隆对象的简单方法是这样的:
obj = Foo.objects.get(pk=<some_existing_pk>)
obj.pk = None
obj.save()
Run Code Online (Sandbox Code Playgroud)
但是,我想做的更深入。例如,我有一个models.py
class Post(TimeStampedModel):
author = models.ForeignKey(User, related_name='posts',
on_delete=models.CASCADE)
title = models.CharField(_('Title'), max_length=200)
content = models.TextField(_('Content'))
...
class Comment(TimeStampedModel):
author = models.ForeignKey(User, related_name='comments',
on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
comment = models.TextField(_('Comment'))
...
class CommentAttribute(TimeStampedModel):
comment = models.OneToOneField(Comment, related_name='comment_attribute',
on_delete=models.CASCADE)
is_bookmark = models.BooleanField(default=False)
...
class PostComment(TimeStampedModel):
post = models.ForeignKey(Post, related_name='post_comments',
on_delete=models.CASCADE)
comments = models.ManyToManyField(Comment)
...
Run Code Online (Sandbox Code Playgroud)
当我从 克隆父对象时
Post,子对象如Comment、CommentAttribute也PostComment将通过以下新克隆的Post对象进行克隆。子模型是动态的。因此,我想通过创建对象克隆器之类的工具来使其变得简单。
下面的代码片段是我所做的;
from django.db.utils …Run Code Online (Sandbox Code Playgroud) 我需要为特定模型查询一组对象,更改单个属性/列(“帐户”),然后将整个查询集的对象保存为新对象/行。换句话说,我想复制对象,并在重复项上更改单个属性(“帐户”)。我基本上是创建一个新帐户,然后遍历每个模型并将以前帐户的对象复制到新帐户,因此我将使用不同的模型重复执行此操作,可能使用 django shell。我应该如何处理这个问题?可以在查询集级别完成还是需要遍历所有对象?
IE,
MyModel.objects.filter(account="acct_1")
# Now I need to set account = "acct_2" for the entire queryset,
# and save as new rows in the database
Run Code Online (Sandbox Code Playgroud)