Django递归关系:如何从Manager对象中删除对象

时间:2016-03-20 06:37:00

标签: python django django-models

我有一个下面的类(其他字段很简单(作者等),所以省略了。)

class Article(models.Model):

origin = models.ForeignKey('self', null=True, related_name="%(app_label)s_%(class)s_revision")

我想在a.website_article_revision列表中存储文章的所有修订版。当我add对该列表进行修订后,就像a.website_article_revision.add(rev)那样,它会自动添加到Article.objects管理器中,这可以理解,因为修订对象本身就是一个文章实例。但我不希望任何修订版本出现在经理对象中,只能出现在文章对象a.website_article_revision的列表属性中。

P.S。我真的不想创建子类。

2 个答案:

答案 0 :(得分:0)

如果您不希望自己对修订版进行建模,可以django-reversion为您完成工作:

  

django-reversion 是Django Web框架的扩展,提供全面的版本控制功能。

正确记录。

答案 1 :(得分:0)

听起来像是custom managers的工作:

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")

这将替换objects模型中的默认Article经理,Article.objects.all()将返回origin nullorigin is None的所有文章。

我假设检查ForeignKey是否是您想要确定任何给定文章对象是否不是修订版。

编辑:您可能希望将来源OneToOneField更改为create trigger info22 after insert on table_info1 for each row when( :new.pid < 60 ) begin dbms_output.put_line(' thus the given id is less than 60'); insert into table_info2 values(:new.pid, :new.pname, :new.ploc); end; 。毕竟,一篇文章可能只有一个版本,而该版本可能有另一个版本,依此类推。