python - Django内使用filter过滤时间,只认年份不认月份是怎么回事?

 甩小三弃小四 发布于 2022-10-29 02:28

想用Django开发一个个人博客,参考了网上的一些文章和Django文档,目前做到日期归档这个功能,以下是有问题的View

class ArchiveView(ListView):
   template_name = "blog.html"
   context_object_name = "articles"
 
   def get_queryset(self):
       # 接收从url传递的year和month参数,转为int类型
       year = int(self.kwargs['year'])
       month = int(self.kwargs['month'])
       # 按照year和month过滤文章
       article_list = ArticleModel.manager.filter(status='p', add_time__year=year, add_time__month=month).order_by('-add_time')
 
       for article in article_list:
           pdb.set_trace()
           article.content= markdown2.markdown(article.content, extras=['fenced-code-blocks'], )
       return article_list
 
   def get_context_data(self, **kwargs):
       return super(ArchiveView, self).get_context_data(**kwargs)

用pdb试了很久,最后发现问题出在这一句:

article_list = ArticleModel.manager.filter(status='p', add_time__year=year, add_time__month=month).order_by('-add_time')

其中add_time__month=month无法过滤到正确月份,导致结果的QuerySet为空;pdb调试上面这个View中的month变量和article.add_time.month又确实是一样的,理论上应该可以得到我想要的文章。
注:status='p'add_time__year=year都可以成功地找到符合条件的文章;也试过用Q,结果是一样的。
不知道问题描述清楚了没有= =|||,我现在也没有头绪,如果大家也不知道,那么从经验上来说,这个问题应该怎么去找解决办法……


这是我的ArticleModels,还附带了自定义的Manager,不知道会不会是因为这个影响到的。

class ArticleAchiveManage(models.Manager):
    def archive(self):
        date_list = ArticleModel.manager.dates('add_time', 'month', order='DESC')
        # 获取到降序排列的精确到月份且已去重的文章发表时间列表
        # 并把列表转为一个字典,字典的键为年份,值为该年份下对应的月份列表
        date_dict = defaultdict(list)
        for d in date_list:
            date_dict[d.year].append(d.month)
        # 模板不支持defaultdict,因此我们把它转换成一个二级列表,由于字典转换后无序,因此重新降序排序
        return sorted(date_dict.items(), reverse=True)


class ArticleModel(models.Model):
    STATUS_CHOICES = (
            ('d', '草稿'),
            ('p', '已发布')
        )
    category = models.ForeignKey('CategoryModel', verbose_name='分类', null=True)
    status = models.CharField('文章状态', default='d', max_length=1, choices=STATUS_CHOICES)
    manager = ArticleAchiveManage()
    title = models.CharField(max_length=32, verbose_name=u'标题')
    abstract = models.TextField(max_length=144, verbose_name='摘要', default='')
    content = models.TextField(verbose_name=u'内容')
    add_time = models.DateTimeField(verbose_name=u'发表时间', auto_now_add=True)
    last_modified_time = models.DateTimeField('修改时间', auto_now=True)
    read_times = models.PositiveIntegerField(verbose_name=u'阅读次数', default=0)
    bravo_times = models.PositiveIntegerField(verbose_name=u'点赞', default=0)

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.title
1 个回答
  • # 可以使用如下方式进行筛选,筛选的值格式和你DB中的格式对应,比如是2017/04/12还是2017-04-12
    article_list = ArticleModel.objects.filter(status='p', add_time__startswith='2017-04-12').order_by('-add_time')
    
    #如果只想根据年月来筛选就是
    article_list = ArticleModel.objects.filter(status='p', add_time__startswith='2017-04').order_by('-add_time')
    2022-11-12 01:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有