*使用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)
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'),
<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