实现文章系列/多部分博客文章的理想方式

时间:2017-09-19 19:43:57

标签: python sql django

我正在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)

接下来出现的问题是如何跟踪帖子的位置和系列长度(即:4个中的2个)。我考虑使用系列条目ID,或发布日期,但我不能保证这些将与帖子的顺序相同。

我可以在文章表上简单地跟踪它。然后我可以在系列对象上使用.count()作为系列长度,并直接从字段中获取文章位置:这似乎并不像它可能那么优雅:

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

然后我考虑制作第三张表,其中每行都会反映一系列文章:

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

我最终希望能够像这样访问信息:

{% if article.series is not None %}
    This post as part {{?}} in a {{?}} part series titled {{?}}
    View previous post {{?}}, view next post {{}}
{% endif %}

我觉得必须有更好的方法。提前致谢

1 个答案:

答案 0 :(得分:1)

只有两种型号的方法就足够了。第三个模型 - ArticleSeriesEntry并没有真正起任何作用。所以,我放弃了。

关于如何获取系列中的下一篇或上一篇文章,我将在Article模型上创建两个方法来实现这一点:

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

然后在模板中:

{% 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 %}