Странное поведение Django queryset при попытке фильтрации с использованием филера 'lte' по полю datetime
Я наблюдаю странное поведение одной из моих моделей и с трудом могу отследить, что происходит. В моем приложении есть относительно простая модель "posts", которую я пытаюсь передать в ListView:
# models.py
class Posts(models.Model):
draft = 0
published = 1
status_choices = [(draft, "Draft"), (published, "Published")]
id = models.AutoField(primary_key=True, unique=True)
title = models.CharField(max_length=500)
slug = models.SlugField(max_length=500, unique=True)
text = models.TextField(null=False)
html = models.TextField(blank=True, null=True)
status = models.IntegerField(choices=status_choices, default=draft)
create_date = models.DateTimeField(default=timezone.now, verbose_name="Post date")
update_date = models.DateTimeField(default=timezone.now, verbose_name="Last edited")
def __str__(self):
return self.title
def save(self, *args, **kwargs):
savetime = datetime.now().replace(microsecond=0)
if savetime != self.create_date # set the update date if needed
self.update_date = savetime
if not self.slug:
self.slug = slugify(self.title) # make sure the post gets a slug
self.html = md.convert(self.text) # convert markdown to HTML for storage
return super().save(*args, **kwargs)
# views.py
class PostList(ListView):
context_object_name = "posts"
model = Posts
queryset = (
Posts.objects.all()
.filter(create_date__lte=datetime.now(), status__exact=1)
.order_by("-create_date")
)
template_name = "post.html"
paginate_by = 20
paginate_orphans = 2
Но когда я создаю новый пост, он не отображается в шаблоне, пока я не перезапущу приложение. Я думаю, что это может быть связано с фильтром create_date__lte=datetime.now()
, потому что когда я его убираю, он работает нормально. (Я не хочу его убирать... Я хочу иметь возможность датировать сообщение в будущем, чтобы оно появлялось после этого времени.
Но даже с установленным фильтром, когда я смотрю на запрос в оболочке Django, кажется, что он работает - в примере ниже, POST1, POST2 и POST3 все в прошлом, но POST4 датирован будущим.
>>> p = Posts.objects.all().filter(create_date__lte=datetime.now(), status__exact=1).order_by("-create_date")
>>> p
<QuerySet [<Posts: POST3>, <Posts: POST2>, <Posts: POST1>]>
>>> p = Posts.objects.all().filter(status__exact=1).order_by("-create_date")
>>> p
<QuerySet [<Posts: POST4>, <Posts: POST3>, <Posts: POST2>, <Posts: POST1>]>
>>>
Что здесь происходит?