Django — не удается сравнить наивные и зависящие от смещения даты или результат не отображается

#python #django

#python #django

Вопрос:

Я получил модель / представление для проекта Story. Моя цель — дать только время для появления историй на моем веб-сайте.

 class Story(models.Model):
    ...
    ...
    image = models.ImageField(upload_to='story/')
    created_on = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return self.title
        
    def save(self):
        super().save()
            
    @property
    def is_active(self):
        #now = timezone.now()
        if (self.created_on   timedelta(days=10)) > datetime.now():
            return False
        return True 

@method_decorator(login_required(login_url='/cooker/login'),name="dispatch")       
class StoryList(generic.ListView):
    queryset = Story.objects.order_by('-created_on')
    template_name = 'user_list_story.html'
    model = Story 
  

Я получаю эту проблему:
не удается сравнить даты, зависящие от смещения, и даты, зависящие от смещения, поэтому я попытался исправить это для того же сравнения.

 @property
    def is_active(self):
        now = timezone.now()
        if (self.created_on   timedelta(days=10)) > now:
            return False
        return True 
  

Но на моей странице ничего не отображается. Вот шаблон кода.

 {% for story in story_list %}
      {% if story.is_active %}
      
      
      {{ story.title }}
      
      {% endif %}
      {% endfor %}
  

Комментарии:

1. Вы установили USE_TZ = True в settings.py ?

2. Да, и я добавил из django.utils часовой пояс импорта в мои модели

3. каково значение created_on в вашей таблице, также почему бы вам не использовать filter в наборе запросов вместо этого

4. 2020-09-11 17:15:42.725268 10 дней больше, чем сейчас ()

5. @Louis: вы, вероятно, хотите поменять местами True и False , поэтому return self.created_on timedelta(days=10) > now .

Ответ №1:

Нет необходимости выполнять эту проверку, вы можете отфильтровать набор запросов. Это более эффективно, поскольку фильтрация выполняется на стороне базы данных:

 from django.contrib.auth.mixins import LoginRequiredMixin
from django.utils.timezone import now

class StoryList(LoginRequiredMixin, generic.ListView):
    queryset = Story.objects.order_by('-created_on')
    template_name = 'user_list_story.html'
    model = Story
    login_url = '/cooker/login'

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            created_on__gte=now()-timedelta(days=10)
        )  

Примечание: Вы можете ограничить просмотры представлением на основе классов для аутентифицированных пользователей с помощью
LoginRequiredMixin смешивание [Django-doc].