为什么datetime__range无法正常工作?

时间:2019-05-23 08:12:21

标签: django datetime django-views

观看次数

   @Override
    public void configure(final ClientDetailsServiceConfigurer clients) 
     throws Exception {
        clients.inMemory()
                .withClient("SampleClientId")
                .secret(passwordEncoder.encode("secret"))
                .authorizedGrantTypes( "password", "authorization_code", "refresh_token", "implicit")
                .scopes( "user_info","read", "write", "trust")
                .autoApprove(true)
  .accessTokenValiditySeconds(3600)// 1 hour
                .refreshTokenValiditySeconds(3600*24*10)// 10 day
                .and()
                .withClient("OTTAppId")
                .secret(passwordEncoder.encode("secret1"))
                .authorizedGrantTypes( "password", "authorization_code", "refresh_token", "implicit")
                .scopes("user_info","read", "write", "trust")
                .autoApprove(true)

模型

import datetime
from .models import AccountTransaction


date = datetime.datetime.today()

def account_transactions_week_view(request):
    account_transactions = AccountTransaction.objects.filter(user_id = request.user.id).filter(datetime__range=[date - datetime.timedelta(days=7), date])

我将过去一周的最新条目列表带到页面上。为此,我使用了过滤器。

我想知道为什么该变体无法正常工作(一段时间后会出现新条目):

class AccountTransaction(models.Model):
    user = models.ForeignKey(User, verbose_name=_('user'))
    datetime = models.DateTimeField(_('created at'), auto_now_add=True)

但是此变体可以正常工作:

filter(datetime__range=[date - datetime.timedelta(days=7), date])

我想知道第一个是怎么了?

中间件

filter(datetime__gt=date - datetime.timedelta(days=7))

设置

class TimezoneMiddleware(object):
    def process_request(self, request):
        tzname = request.session.get('django_timezone')
        if not tzname:
            request.session['django_timezone'] = 'Europe/Kiev'
            tzname = 'Europe/Kiev'
        timezone.activate(pytz.timezone(tzname))

1 个答案:

答案 0 :(得分:3)

您已经在方法之外定义了date。这意味着定义是在首次导入模块,Django进程启动时执行的。对于该过程的所有用途,它将保持相同的值,直到服务器决定回收它并创建一个新值为止。因此,您的范围查询将在该过程的生存期内将原始值用作所有查询的终点。

解决方案是将定义简单地移到view函数内部。

(您的其他查询之所以起作用,是因为它只是在执行“自原始日期起大于7天的所有内容”,它会自动包含大于原始日期的事物。)