Précautions lors de la création d'une vue qui réduit les enregistrements par date et heure

Je le ferai à chaque fois, donc comme mémo pour moi-même. Je suis déçu car je n'ai pas pu trouver un titre convenable. ..

Lors de la mise en œuvre d'articles de presse dans Django, je pense qu'il est courant de définir des champs tels que la date et l'heure de publication et la date d'expiration et de basculer entre public et privé par rapport à la date et l'heure actuelles, mais comme suit Il n'est pas bon d'écrire.

from django.db import models
from django.utils import timezone


class ArticleManager(models.Manager):
    def published(self):
        qs = self.get_queryset()
        return qs.filter(published_at__lte=timezone.now())


class Article(models.Model):
    title = models.CharField('Titre', max_length=100)
    published_at = models.DateTimeField('Date et heure de publication', default=timezone.now)

    objects = ArticleManager()


class ArticleView(ListView):
    queryset = Article.objects.published()  #Ce n'est pas bien
    # queryset = Article.objects.filter(published_at__lte=timezone.now())  #Bien sûr, c'est aussi inutile

Les raisons ne sont pas bonnes

Si vous y réfléchissez un instant, vous pouvez voir que le queryset spécifié dans ʻArticleView est une variable de classe, donc la classe est lue et la valeur est déterminée au démarrage du serveur. ʻArticle.objects.published () fonctionne à la date et à l'heure auxquelles ce processus a été exécuté, donc dans le cas ci-dessus, il fonctionne comme l'heure à laquelle le serveur a démarré est l'heure actuelle.

Solution

Ce que je veux faire, c'est «je veux juger si c'est public ou privé en fonction de la date et de l'heure demandées», donc si vous faites ce qui suit, cela fonctionnera correctement.

from django.db import models
from django.utils import timezone


class ArticleManager(models.Manager):
    def published(self):
        qs = self.get_queryset()
        return qs.filter(published_at=timezone.now())


class Article(models.Model):
    title = models.CharField('Titre', max_length=100)
    published_at = models.DateTimeField('Date et heure de publication', default=timezone.now)

    objects = ArticleManager()


class ArticleView(ListView):
    queryset = Article.objects.all()

    #Fonctionne à chaque demande
    def get_queryset(self):
        qs = super(ArticleView, self).get_queryset()
        return qs.published()

Résumé

Ce n'est rien de plus qu'une simple «erreur de négligence», mais j'y suis accro sans rien remarquer d'autre (peut-être juste moi !!), alors faites attention.

Recommended Posts

Précautions lors de la création d'une vue qui réduit les enregistrements par date et heure
Précautions lors de la création d'un générateur Python
[Python] Renommez tous les fichiers image dans un dossier spécifique par date et heure de prise de vue
Créer une liste lorsque la nomenclature est pour une certaine période de temps
Script shell qui numérote les noms en double lors de la création de fichiers
[Python] Créer une liste de dates et d'heures pour une période spécifiée