django 个人博客系统开发 - 文章归档

本文介绍了一种在Django中使用ORM自定义Manager的方法来去除数据库查询中的重复日期,通过自定义Manager并覆盖其方法实现高效的数据处理,避免了使用原始SQL带来的复杂性和潜在风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*使用values distinct去掉重复数据(不可行)


*直接使用sql查询方式(不推荐使用)

**归档语句

SELECT DISTINCT DATE_FORMAT(date_published, '%Y-%m')  as col_date From blog_article ORDER BY  blog_article.date_published DESC LIMIT 21;

**raw - 返回结果必须包含主键 (不可行)

Article.objects.raw('...')

**execute

from django.db import connection
...
def index(request):

    # 文章归档
    sql = "SELECT DISTINCT DATE_FORMAT(date_published, '%Y-%m')  as col_date From blog_article ORDER BY  blog_article.date_published DESC LIMIT 21;"
    cursor = connection.cursor()
    cursor.execute(sql)
    rows = cursor.fetchall()
    print (rows)


*自定义manager管理器

blog.models

# 自定义一个Model的管理器
# 新加一个数据处理方法
class ArticleManager(models.Manager):
    def distinct_date(self):
        distinct_date_lst = []
        date_lst = self.values('date_published')
        for date in date_lst:
            date = date['date_published'].strftime("%Y/%m") + "文章归档"
            if date not in distinct_date_lst:
                distinct_date_lst.append(date)
        return distinct_date_lst

关联manager到Article

class Article(models.Model):
    title = models.CharField(max_length=50, verbose_name='文章标题')
    desc = models.CharField(max_length=50, verbose_name='文章描述')
    content = models.TextField(verbose_name='文章内容')
    # content = RichTextField(verbose_name='文章内容')
    click_count = models.IntegerField(default=0, verbose_name='点击量')
    is_recommend = models.BooleanField(default=False, verbose_name='是否推荐')
    date_published = models.DateTimeField(auto_now_add=True, verbose_name='发布时间')
    user = models.ForeignKey(User, verbose_name='用户')
    category = models.ForeignKey(Cateory, verbose_name='分类')
    tag = models.ManyToManyField(Tag, verbose_name='标签')
    
    objects = ArticleManager() ##
    
    class Meta:
        verbose_name = '文章'
        verbose_name_plural = verbose_name
        ordering = ['-date_published']

    def __str__(self):
        return self.title

views 增加archive视图

def archive(request):
    try:
        # 获取客户端的信息
        year = request.GET.get('year', None)
        month = request.GET.get('month', None)

        articles = Article.objects.filter(date_published__icontains=year+'-'+month)
        paginator = Paginator(articles, 2)
        try:
            page = int(request.GET.get('page', 1))
            articles = paginator.page(page)
        except PageNotAnInteger:
            articles = paginator.page(1)
        except EmptyPage:
            articles = paginator.page(paginator.num_pages)

        archives = Article.objects.distinct_date()

    except Exception as e:
        logger.error(e)

    return render(request, 'archive.html', locals())

urls增加

url(r'^archive/$', archive, name = 'archive'),


模板base.html 增加归档列表

      <h3>归档文章</h3>
      <ul>
          {% for archive in archives %}
        <li><a href="{% url 'archive' %}?year={{ archive|slice:':4' }}&month={{ archive|slice:'5:7' }}">{{ archive }}</a>
        </li>
          {% endfor %}
      </ul>

新增archive.html模板 类似index.html







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值