[PYTHON] Vorsichtsmaßnahmen beim Erstellen einer Ansicht, die Datensätze nach Datum und Uhrzeit eingrenzt

Ich werde es jedes Mal tun, also als Memo für mich. Ich bin enttäuscht, weil ich keinen passenden Titel finden konnte. ..

Bei der Implementierung von Nachrichtenartikeln in Django ist es meines Erachtens üblich, Felder wie Veröffentlichungsdatum und -zeit sowie Ablaufdatum festzulegen und im Vergleich zum aktuellen Datum und der aktuellen Uhrzeit zwischen öffentlich und privat zu wechseln, jedoch wie folgt Es ist nicht gut zu schreiben.

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('Titel', max_length=100)
    published_at = models.DateTimeField('Datum und Uhrzeit der Veröffentlichung', default=timezone.now)

    objects = ArticleManager()


class ArticleView(ListView):
    queryset = Article.objects.published()  #Das ist nicht gut
    # queryset = Article.objects.filter(published_at__lte=timezone.now())  #Das ist natürlich auch nutzlos

Gründe nicht gut

Wenn Sie einen Moment darüber nachdenken, können Sie sehen, dass das in "ArticleView" angegebene "Abfrageset" eine "Klassenvariable" ist, sodass die Klasse gelesen und der Wert beim Starten des Servers bestimmt wird. Article.objects.published () wird an dem Datum und der Uhrzeit ausgeführt, an dem dieser Prozess ausgeführt wurde. In dem obigen Fall funktioniert es also wie "die Zeit, zu der der Server als aktuelle Uhrzeit gestartet wurde".

Lösung

Was ich tun möchte, ist "Ich möchte anhand des angeforderten Datums und der angeforderten Uhrzeit beurteilen, ob es öffentlich oder privat ist". Wenn Sie also Folgendes tun, funktioniert es ordnungsgemäß.

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('Titel', max_length=100)
    published_at = models.DateTimeField('Datum und Uhrzeit der Veröffentlichung', default=timezone.now)

    objects = ArticleManager()


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

    #Funktioniert bei jeder Anfrage
    def get_queryset(self):
        qs = super(ArticleView, self).get_queryset()
        return qs.published()

Zusammenfassung

Es ist nichts weiter als nur ein "nachlässiger Fehler", aber ich bin süchtig danach, ohne etwas anderes zu bemerken (vielleicht nur ich !!), also sei bitte vorsichtig.

Recommended Posts

Vorsichtsmaßnahmen beim Erstellen einer Ansicht, die Datensätze nach Datum und Uhrzeit eingrenzt
Vorsichtsmaßnahmen beim Erstellen eines Python-Generators
[Python] Benennen Sie alle Bilddateien in einem bestimmten Ordner nach Aufnahmedatum und -zeit um
Erstellen einer Liste, wenn die Nomenklatur für einen bestimmten Zeitraum gültig ist
Shell-Skript, das beim Erstellen von Dateien doppelte Namen nummeriert
[Python] Erstellen Sie eine Datums- und Zeitliste für einen bestimmten Zeitraum