Python: Сравнение даты и массовое обновление некоторых полей
Я создал функцию обновления для моего модуля событий, в которой, если дата события уже прошла, она будет массово обновлять статус до 0. models.py
class Events(models.Model):
id = models.AutoField(db_column='id', primary_key=True)
title = models.CharField(max_length=45, blank=True, null=True)
venue = models.CharField(max_length=45, blank=True, null=True)
date = models.DateTimeField(max_length=45, blank=True, null=True)
description = models.CharField(max_length=255, blank=True, null=True)
image = models.ImageField(upload_to=eventpath, blank=True, null=True)
manager = models.CharField(max_length=100, blank=True, null=True)
attendees = models.CharField(max_length=100, blank=True, null=True)
date_posted = models.DateTimeField(max_length=45, blank=True, null=True)
status = models.BooleanField(default=1)
Вот как я добавляю событие.
def uploadEvent(request):
if request.method == "POST":
item = Events()
item.title = request.POST.get('title')
item.venue = request.POST.get('venue')
date = request.POST.get('date')
date_object = datetime.datetime.strptime(date, '%a %b %d %Y %I:%M %p')
item.date = date_object
item.manager = request.POST.get('manager')
item.attendees = request.POST.get('attendees')
item.description = request.POST.get('description')
date_posted = datetime.datetime.strptime(date, '%a %b %d %Y %I:%M %p')
item.date_posted = date_posted
if len(request.FILES) != 0:
item.image = request.FILES['image']
item.save()
return redirect('/amsai/events/')
return render(request, 'admin/events_add.html')
Вот как я хочу обновлять все события. Я преобразовал obj.date
в date()
def refreshEvent(request):
events = Events.objects.all()
status = 0
date = datetime.datetime.today().date()
if events:
for obj in events:
if obj.date.date() < date:
Events.objects.filter(*****).update(status=status)
return redirect('/amsai/events/')
Проблема в том, как я могу отфильтровать эти переданные даты? Я не знаю, что написать внутри filter().
Это асимптотически более эффективно.
def refreshEvent(request):
Events.objects.filter(date__lt=datetime.now()).update(status=False)
return redirect('/amsai/events/')
Теперь filter()
выполняет поиск в базе данных напрямую и выдает QuerySet
, содержащий Events
такой, что Events.date
равен __lt
(меньше, чем) datetime.now()
.
Не волнуйтесь, QuerySet
ленивы, поэтому QuerySet
, созданный filter()
, даже не будет оценен, пока не будет вызван update()
.