2016-03-20 6 views
0

からオブジェクトを削除するにはどうすれば次のクラス(他のフィールドは些細ある(著者、など)ので省略)を持っています。ジャンゴ再帰的関係:Managerオブジェクト

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.私は本当にサブクラスを作成したくありません。

+0

最後の文章を改訂することはできますか? – v1k45

+0

@ v1k45、私が望むものが不可能ならば、改訂のためにその記事モデルをサブクラス化しなければならない。可能な限りエレガントで小さなコードを書こうと思っただけです。 –

+0

私はあなたを混乱させて申し訳ありませんが、私はこの行について尋ねていましたが、マネージャオブジェクトにはリビジョンは表示されません...._ – v1k45

答えて

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

これはあなたのArticleモデルのデフォルトobjectsマネージャに置き換えられます、そしてArticle.objects.all()originだすべての記事がnullで返されます。

私はorigin is Noneかどうかをチェックすると、あなたが任意の記事オブジェクトが改訂されていない場合を判断する方法であると仮定しています。

EDIT:あなたはOneToOneFieldに起源ForeignKeyを変更したい場合があります。結局のところ、記事には1つのリビジョンしかない場合があり、そのリビジョンには別のリビジョンなどがある可能性があります。

+0

私のための解決策のような音。私は唯一のフィルタリングがあまりにも多くのサーバーリソースを消費する恐れがあり、おそらく私はコードの数ダースの行を書く必要があります。より重要な長さや性能は何ですか(100Kの記事を持つ仮説的なウェブサイトを想定)。 –

+0

@ koala-lava正直言って、記事モデルをサブクラス化する前に、この解決策を試してみたいと思います。このソリューションでは、記事の素敵な「連鎖」があり、それぞれが後継者を指しています。サブクラス化する場合は、アーティクルの最初のバージョンをアーティクルテーブルに残し、別のテーブルにリビジョンを置く必要があります。最後のものを見つけるには、そのテーブルを日付でソートする必要があります。また、記事に改訂版があるかどうかを判断するために、Djangoは少なくとも1回は参加します。このソリューションでは、外部キーがnullであるかどうかをチェックするだけなので、結合は必要ありません。 –

0

あなたのリビジョン自分自身をモデル化したくない場合は、あなたのための仕事をしてdjango-reversionがある:

ジャンゴ-復帰は、包括的なバージョン管理機能を提供DjangoのWebフレームワークを拡張したものです。

それは適切に文書化されています。