我有一个对象
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
当我只过滤状态时,它没有问题,但是当我想要"得到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一直没有
答案 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()