2017-09-19 9 views
0

私は、主に教育的練習として、ブログエンジンをdjangoに書き込む過程にあり、複数の部分のブログ投稿/シリーズの実装については疑問があります。記事シリーズ/マルチパートブログ投稿を実装する理想的な方法

私はpython3/djangoで作業していますので、私のコードはこのようになりますが、私は主にデータベース構造を適切に実装することに関心があります。この一般的なモデルを考える:

class Article(models.Model): 
    title = models.Charfield(255) 
    content = models.TextField() 

私の最初のアイデアは、単にシリーズテーブルを追加し、記事にリンクすることです:

class Article(models.Model): 
    title = models.Charfield(255) 
    content = models.TextField() 
    series = models.ForeignKey('Series') 


class Series(models.Model): 
    title = models.Charfield(255) 

次ここに来る問題はポストの位置を追跡する方法ですシリーズ長さ(すなわち、2の4)。シリーズエントリーのIDや投稿の公開日を使用することを考えましたが、投稿と同じ順序でそれらが出ることは保証できません。

私は単に記事テーブルにそれを記録することができます。次に、一連の長さのシリーズオブジェクトに.count()を使用して、フィールドから直接記事位置を取得することができます:

class Article(models.Model): 
    title = models.Charfield(255) 
    content = models.TextField() 
    series = models.ForeignKey('Series') 
    part = models.PositiveIntegerField() 

{% if article.series is not None %} 
    This post as part {{?}} in a {{?}} part series titled {{?}} 
    View previous post {{?}}, view next post {{}} 
{% endif %} 
:私は最終的にはちょうどこのように、多少の情報にアクセスするためエーブルされてみたい

class Article(models.Model): 
    title = models.Charfield(255) 
    content = models.TextField() 

class Series(models.Model): 
    title = models.Charfield(255) 

class ArticleSeriesEntry(models.Model): 
    article = models.OneToOneField('Article', related_name='series_info') 
    series = models.ForeignKey('Series', related_name='entries') 
    part = models.PositiveIntegerField() 

は、それから私は、各シリーズの資料を反映する行をだ第三のテーブルを作りについて考えました

もっと良い方法があるように感じる。事前に感謝します

答えて

1

あなたのアプローチは2つのモデルだけで十分です。第3のモデル - ArticleSeriesEntryは実際には何の目的も果たしません。だから私はそれを避けるだろう。テンプレート内の

class Article(models.Model): 
    # ... other fields ... 
    part = models.PositiveIntegerField() 

    def prev_part(self): 
     try: 
      prev_part = Article.objects.get(series=self.series, part=self.part-1) 
     except Article.DoesNotExist: 
      prev_part = None 
     return prev_part 

    def next_part(self): 
     try: 
      next_part = Article.objects.get(series=self.series, part=self.part+1) 
     except Article.DoesNotExist: 
      next_part = None 
     return next_part 

    def get_absolute_url(self): 
     # this should return url for the given article 
     # see docs: https://docs.djangoproject.com/en/1.11/ref/models/instances/#get-absolute-url 
     pass 

その後:シリーズの次または前の記事を取得する方法について

、私はちょうどそれを行うにArticleモデル上の2つのメソッドを作成したい

{% if article.series %} 
    This post is part {{ article.part }} in a {{ article.series.article_set.count }} part series titled {{ article.series.title }} 

    {% if article.prev_part %} 
     View previous post: <a href="{{ article.prev_part.get_absolute_url }}">{{ article.prev_part.title }}</a> 
    {% endif %} 

    {% if article.next_part %} 
     View next post: <a href="{{ article.next_part.get_absolute_url }}">{{ article.next_part.title }}</a> 
    {% endif %} 
{% endif %} 
関連する問題