Python Django递归关系:如何从管理器对象中删除对象

Python Django递归关系:如何从管理器对象中删除对象,python,django,django-models,Python,Django,Django Models,我有一个下面的类(其他字段都是琐碎的(author等),所以省略了) 我想在a.website\u article\u revision列表中存储文章的所有修订版。当Iadda.website\u article\u revision.add(rev)之后,它会自动添加到article.objects管理器中,这是可以理解的,因为revision对象本身就是一个article实例。但是我不希望任何修订显示在manager对象中,只显示在文章对象的列表属性中a.website\u article\

我有一个下面的类(其他字段都是琐碎的(author等),所以省略了)

我想在
a.website\u article\u revision
列表中存储文章的所有修订版。当I
add
a.website\u article\u revision.add(rev)之后,它会自动添加到
article.objects
管理器中,这是可以理解的,因为revision对象本身就是一个article实例。但是我不希望任何修订显示在manager对象中,只显示在文章对象的列表属性中
a.website\u article\u revision


另外,我真的不想创建子类。

如果您不想自己为修订版建模,那么有一种方法可以帮您完成这项工作:

django reversion是django web框架的扩展,提供全面的版本控制功能

它有适当的文档记录。

听起来像是针对以下人员的工作:

这将替换
文章
模型中默认的
对象
管理器,以及
文章.objects.all()
将返回所有
来源
空的文章

我假设检查
origin是否为None
是确定任何给定文章对象是否不是修订的方式


编辑:您可能希望将原点
外键
更改为
OneToOneField
。毕竟,一篇文章可能只有一个版本,而该版本可能有另一个版本,依此类推。

你能重新表述最后一句话吗?@v1k45,如果我想要的是不可能的,那么我必须对该文章模型进行子类化,以便进行修订。如果可能的话,我只是想写一些优雅的小代码。很抱歉,我把你搞糊涂了,我问的是这一行,但我不想在manager对象中出现任何修订…@v1k45每当我向一篇文章对象添加修订时,
website\u article\u revision
列表中,它也会出现在
article.objects.all()
我想将此管理器中的对象仅用于文章(不是修订版文章实例,只有原始文章)。修订对象与原始文章具有相同的字段,因为它们都由单个文章类组成。您可以将类似于
is\u latest\u version
的字段添加到
article
中,并仅为原始文章将其值指定为
True
,然后使用
.filter()
只返回原创文章。听起来对我来说是个解决方案。我只是担心过滤会消耗太多的服务器资源,也许我应该写几十行代码。什么是更重要的长度或性能?(假设一个假设的网站有10万篇文章)。@koalalava老实说,在对你的文章模型进行子类化之前,我会尝试这个解决方案。有了这个解决方案,您就有了一个很好的文章“链”,每一篇文章都指向它的继任者。如果您使用子类,那么您必须在article表中保留文章的第一个版本,并将修订放在各自的单独表中,并且必须按日期对该表进行排序,以找到最后一个版本。此外,Django将至少进行1次联接,以确定一篇文章是否有修订。使用此解决方案,不需要联接,因为只需检查外键是否为null。
class Article(models.Model):

origin = models.ForeignKey('self', null=True, related_name="%(app_label)s_%(class)s_revision")
class ArticleManager(models.Manager):
    def get_queryset(self):
        return super(ArticleManager, self).get_queryset().filter(origin=None)

class Article(models.Model):
    objects = ArticleManager()
    origin = models.ForeignKey('self', null=True, related_name="%(app_label)s_%(class)s_revision")