Причина для фильтра (admin_approved=True, действителен_от__lte= now, действителен_до__gte = now) не работает немедленно?

#python #django

#python #django

Вопрос:

У меня есть проект, в котором есть сообщения, которые я хочу отображать в течение определенного периода времени valid_from и valid_to

итак, проблема здесь в том, что я добавил правильные фильтры и выбрал время, но сообщения продолжают отображаться, хотя время valid_to прошло. Я сомневался, пока не добавил обратный отсчет, который стал отрицательным и превысил значение времени valid_to .

Я пытаюсь понять причину этой проблемы и как ее исправить? вот модели:

 class Post(models.Model):
    valid_from = models.DateTimeField(blank=True, null=True)
    valid_to = models.DateTimeField(blank=True, null=True)
  

Вот veiws:

 class PostListView(ListView):
    model = Post
    template_name = "post.html"
    context_object_name = 'posts'
    now = timezone.now()
    queryset = Post.objects.filter(valid_from__lte=now, valid_to__gte=now)
  

Ответ №1:

now не будет обновляться, он просто примет значение, когда класс интерпретируется в первый раз, а затем повторно использует это значение каждый раз.

Вы можете переопределить get_queryset(…) метод [Django-doc], но, возможно, более элегантно использовать Now() выражение [Django-doc] базы данных:

 from django.db.models.functions import Now

class PostListView(ListView):
    model = Post
    template_name = 'post.html'
    context_object_name = 'posts'
    queryset = Post.objects.filter(
        valid_from__lte=Now(),
        valid_to__gte=Now()
    )  

Вместо этого будет использоваться время базы данных.

Если вы хотите переопределить get_queryset(…) метод вместо этого, вы пишете:

 class PostListView(ListView):
    model = Post
    template_name = 'post.html'
    context_object_name = 'posts'

    def get_queryset(self, *args, **kwargs):
        now = timezone.now()
        return super().get_queryset(*args, **kwargs).filter(
            valid_from__lte=now,
            valid_to__gte=now
        )