#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
)