无法在django 2.0中使用过滤器查询数据库

时间:2018-05-15 09:36:08

标签: django

我正在使用django2.0开发博客应用。

在模型层中,我定义了一个类Post,并使用created_time定义了一个属性DateTimeField,然后我尝试使用两个参数{{基于created_time查询帖子1}}和year,但最后发现查询中没有任何对象。

什么似乎是问题?

1.blog/models.py

month

2.blog/views.py

class Post(models.Model):
    ...
    created_time = models.DateTimeField()
    ...

3.blog/urls.py

def archives(request, year, month):
    post_list = Post.objects.filter(created_time__year=year,
                                    created_time__month=month).
                                     order_by('-created_time')
    print('Year:{0}.\nMonth:{1}'.format(year,month))

    count = 0
    for a in post_list:
        count += 1
    print("I've found {} post here!".format(str(count)))

    return render(request, 
                  'blog/index.html', 
                   context={'post_list': post_list})

  1. 模板/ blog.index.html
  2. urlpatterns = [ ... url(r'^archives/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$',views.archives,name='archives'),

    在数据库中我添加了很多帖子,但最后控制台输出如下: enter image description here

    ** ******为什么?

    请注意,如果我在视图<li><a href="{% url 'blog:archives' date.year date.month %}">{{date.year}}年{{date.month}}月</a></li>中删除一个参数created_time__month=month,如下所示,它可以获得正确的查询结果。

    archives()

    enter image description here

    以下是数据库信息:

    enter image description here

1 个答案:

答案 0 :(得分:1)

首先,您可以将yearmonth url参数转换为int,以确保正确完成过滤。默认情况下,您会将这些值视为str

def archives(request, year, month):
    year, month = int(year), int(month)
    post_list = Post.objects.filter(created_time__year=year,
                                    created_time__month=month).
                                     order_by('-created_time')
    # [...]

然后,不要使用循环来计算查询集的结果数。使用count()

print("I've found {} post here!".format(post_list.count()))

此外,如果您需要了解为什么此特定查询集在其他返回某些结果时不返回任何内容时,您可以检查Django生成的基础SQL查询。这应该有助于确定问题的来源:

print(post_list.query)

此外,如the documentation中所述,Django可能会在执行SQL请求之前将您的日期值转换为当前时区(取决于settings.USE_TZ)。这有时可以解释这种错误。