无法获取对象DateTimeField gte问题

时间:2017-11-17 06:54:15

标签: python django datetime

我有一个对象

class Promo( models.Model ):
    name        = models.CharField(verbose_name="Name"))
    promo_name = models.CharField(verbose_name="Promo Name", max_length=255, null=True, default='')

    status  = models.CharField(
    max_length=255,
    choices=(
        ('publish', 'Published'),
        ('draft',  'Drafted')
    ), default='publish',)

    start_date  = models.DateTimeField(editable=True, auto_now=False, null=True, )
    expire_date = models.DateTimeField(editable=True, auto_now=False, null=True, )
    def __str__(self):
        return "%s" % (self.name, )

我的settings.py:

LANGUAGE_CODE   = 'en-us'
TIME_ZONE       = "Asia/Jakarta"
USE_I18N        = True
USE_L10N        = True
USE_TZ          = True

其中一个对象值是: Timezone is 'Asia/Jakarta'

当我只过滤状态时,它没有问题,但是当我想要"得到start_date大于current_datetime的促销时,我一直都在失败,我不知道为什么,我试图将日期时间设为UTC格式,因为Django似乎将start_date作为UTC时区返回。但仍然失败。

我的代码:

    import pytz
    from django.utils import timezone


    the_promo   = Promo.objects.all().filter(status='publish').first()

    # test
    start_date = the_promo.start_date
    start_date_utc                      = start_date
    current_datetime_date_in_asia_jakarta = timezone.localtime(start_date_utc)
    current_datetime                    = datetime.now(pytz.timezone('Asia/Jakarta')
    current_datetime_utc                = datetime.now(pytz.timezone('UTC'))

    if current_datetime_utc > start_date_utc:
        b='bigger!'
    else:
        b='not bigger'

    the_promo_to_be_used2    = Promo.objects.all().filter(start_date__gte=current_datetime_utc, status='publish').first()

debug中的示例值:

start_date = 2017-11-17 06:17:49+00:00
start_date_utc = 2017-11-17 06:17:49+00:00
current_datetime = 2017-11-17 13:49:13.212000+07:00
current_datetime_utc = 2017-11-17 06:49:13.212000+00:00
b = 'bigger!' # this works how come the query does not work?

但是the_promo_to_be_used2一直没有

2 个答案:

答案 0 :(得分:2)

>>> import datetime
>>> start_date = datetime.datetime(2017,11,17,06,17)
>>> current_date = datetime.datetime(2017,11,17,13,49)
>>> start_date >= current_date  # start_date__gte=current_date
False

检查过滤器,根据所需逻辑将_gte更改为_lt。从我现在看到的情况来看,start_date小于current date,因此过滤器表达式运行良好,您只是进行了错误的过滤。

答案 1 :(得分:1)

你可以在模型上简单地应用filter()。无需使用all()。filter()。 此外,它对我有用:

Promo.objects.filter(status='publish', start_date__gte=curr_date).first() 其中curr_date是datetime对象包含今天的日期。

即curr_date = datetime.datetime(2017,11,17,0,0)

将exp_date包含在过滤器查询中,并根据您的最新评论。它将是:

Promo.objects.filter(status='publish', start_date__lte=curr_date, expiry_date__gte=curr_date).first()