Я хочу получить 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)