2017-08-17 4 views
1

2つの密接に関連した階層ベースのオブジェクト間の関係を定義する "適切な"方法についてはわかりません。密接に関連するオブジェクトのDjangoモデル継承

私はDjangoでフォーラムのようなフレームワークを開発しています。

私の最初のアイデアは、スレッドが基本的に「特別な」種類のPostであるため、完全に機能するPostモデルを作成してから、スレッドモデルを継承し、必要かもしれない。これと同じように:

class Post(models.Model): 
    forum = models.ForeignKey(Forum) 

    title = models.CharField(max_length=50, default="") 
    text = models.CharField(max_length=2000, default="") 

    created = models.DateTimeField(auto_now_add=True) 
    author = models.ForeignKey(User) 

class Thread(Post): 
    thread_views = models.IntegerField() 
    reply_count = models.IntegerField() 
    (...) 

私はまた、「isThread」ブールフィールドを持つ単一の「ポスト」モデルを作りについて考えたが、何かがそれについて権利を感じませんでした。

私は非常に関連性が高いと思われる例を見てきましたが、オブジェクトは別々のテーブルに格納されていると言いますが、この種のデザインには最良の選択肢かどうかはわかりません。

これを行うための「適切な」方法、パフォーマンス上のやり方、そして良い方法は何でしょうか?

+0

実際に 'Post'オブジェクトをデータベースに保存するかどうかによって異なります。あなたが 'Posts'と' Threads'の両方を持っているなら、あなたは正しいことをしています。そうでない場合、将来的に他の種類の投稿があると思われる場合は、 'Post'を[抽象基本クラス]にすることもできます(https://docs.djangoproject.com/ja/1.11/topics/db/models /#abstract-base-classes)は、サブクラス化する必要があります。 'is_thread'のようなものを使うのは最適ではありません。これは、特定の' Thread'フィールドがオプションでなければならず、モデルの検証に頼るのではなくすべての検証を書く必要があるからです。 – dirkgroten

答えて

0

あなたの定義によって異なります。

ThreadPostの違いは何ですか?ThreadPostです。返信はありますか? PostThreadに属している必要がありますか?

私にとって、Postは別のPostへの返信になる可能性があるので、null可能なreply_toFK('self')フィールドが必要な場合があります。

こうすれば、多くの返信がある単一のPostを持つことができ、スレッドを作成することができます。また、返信を許可することもできます(ユースケースによって異なります)。

ビュー数などを保存するには、何らかの時系列の方法でそれを保存することができます(そうすることで、1つの整数ではなく、時間の経過とともにポストがどれほど人気が​​あるかを知ることができます)合計カウントを得るための単純なカウント操作など)

class PostActions: 
    post (link to Post) 
    action ('view', 'like', 'click' etc) 
    timestamp (auto_now) 

これを行うにはさまざまな方法があります。

+0

あなたは正しいです、もっと具体的にすべきでした。 'Thread'は実際には返信を伴う' Post'です。 'Post'は、同じ' Thread'に属していれば、別の 'Post'への返信になることができます。 – Man

+0

その場合、 'Thread'と' Post'の間に実際の共通フィールドはなく、 'Post'と' Thread'の間には2つの別々のモデルクラスとFK関係があります –

関連する問題