Я хочу получить 2 типа событий, а именно, прошлые события и будущие события из моей модели событий на сайте общества дебатов, созданном с помощью Django

Я сделал веб-сайт для общества дебатов нашего колледжа, используя Django.

Хотелось бы иметь 2 типа событий Прошлые и Будущие (Future) по дате_соревнования, т.е. если дата и время соревнования находится в прошлом текущей даты и времени, то вернуть его в прошлые события, а если дата и время соревнования находится в будущем текущей даты и времени, то вернуть его в будущие события

Вот мой файл views.py и файл models.py для событий

models.py

from django.db import models


class Format(models.Model):
    format_name = models.CharField(max_length=100, null=False, unique=True)

    def __str__(self):
        return self.format_name


class Organiser(models.Model):
    organiser_name = models.CharField(max_length=140, null=False, unique=True)

    def __str__(self):
        return self.organiser_name


class Event(models.Model):
    banner_image = models.ImageField(upload_to="events")
    event_name = models.CharField(max_length=150, null=False)
    organiser_of_event = models.ForeignKey(Organiser, on_delete=models.CASCADE)
    format_of_event = models.ForeignKey(Format, on_delete=models.CASCADE)
    date_of_event = models.DateTimeField(auto_now_add=False)
    registration_fees = models.IntegerField(default=0, help_text="Enter Registration Fees For The Event in Rupees")
    details = models.TextField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.event_name

view.py

from django.shortcuts import render
from .models import Event


# Create your views here.
def events(request):
    context = {
        'title': 'Events',
        'events': Event.objects.all()
    }
    return render(request, 'main/Events.html', context)

Какую логику нужно написать, чтобы получить как будущие, так и прошлые события из моей таблицы событий?

(Если вам что-то непонятно или нужно что-то дополнительно, не стесняйтесь спрашивать).

Очевидный способ - просто сделать два запроса, используя операторы __gte (больше или равно) и __lt (меньше чем).

from django.utils import timezone

# ...

now = timezone.now()

context = {
    'title': 'Events',
    'future_events': Event.objects.filter(date_of_event__gte=now),
    'past_events': Event.objects.filter(date_of_event__lt=now),
}

Вы также можете сделать один запрос и выполнить фильтрацию в Python:

now = timezone.now()
all_events = Event.objects.all()
future_events = [e for e in all_events if e.date_of_event >= now]
past_events = [e for e in all_events if e.date_of_event < now]

context = {
    'title': 'Events',
    'future_events': future_events,
    'past_events': past_events,
}

Другой вариант - переписать менеджер, который вы используете для событий, чтобы у вас были Event.past_events.all() и Event.future_events.all()

Вы можете сделать это следующим образом:

from django.utils import timezone

Class PastEventManager(models.Manager):
    def get_queryset(self):
         today = timezone.now()
         return super().get_queryset().filter(date_of_event__lt=today)

Class Event(models.Model):
    ...
    past_events = PastEventManager()
    future_events = FutureEventManager() # same but with date_of_event__gte=today

Вы можете использовать его в своем коде следующим образом:

past_events = Event.past_events.all()
future_events = Event.future_events.filter(put_your_query)
Вернуться на верх