#python #django #django-models #automation
#python #django #django-модели #автоматизация
Вопрос:
Я создаю веб-приложение для бронирования столиков в отеле в Django 3.x.x
У меня есть Table
модель с isBooked
полем, для которого установлено значение или False
или True
в зависимости от состояния таблицы. Код для этой модели:
class Table(models.Model):
title = models.CharField(max_length=50, null=True)
t_id = models.IntegerField("Table ID", null=True, unique=True)
isBooked = models.BooleanField('Is Booked', default=False)
chairs_booked = models.IntegerField("Chairs Booked", default=0)
max_chairs = models.IntegerField("Total Chairs", default=0)
max_book = models.IntegerField("Least Bookable", default=0)
chairs_left = models.IntegerField("empty chairs", default=0)
Теперь у меня есть другая модель, Reservation
которая хранит данные для забронированных Tables
. Вот его код:
class Reservation(models.Model):
t_username = models.CharField("Booked By", max_length=100, null=True)
t_email = models.EmailField("Email Address", null=True)
t_phone = models.IntegerField("Phone Number", default=0, null=True)
t_id = models.IntegerField("Table Id", null=True)
booked_date = models.CharField("Check In Date", null=True, max_length=50) # '2020-10-27'
booked_time = models.CharField("Check in Time", null=True, max_length=50) # '7:00'
def _get_checkout_date(self):
t = self.booked_date
return t
checkout_date = property(_get_checkout_date)
def _get_checkout_time(self):
the_time = dt.datetime.strptime(self.booked_time, '%H:%M')
new_time = the_time dt.timedelta(hours=3)
return new_time.strftime('%H:%M')
checkout_time = property(_get_checkout_time)
на данный момент у меня есть table
следующая информация, хранящаяся в переменных:
booked_time
это содержит строку для времени, показывающую, когда столик был забронирован, например7:00
checkout_time
это содержит строку для времени, показывающую, когда таблица должна быть освобождена / извлечена, например10:00
итак, основываясь на приведенных выше переменных, я хочу автоматически пометить isBooked
свойство таблицы по False
истечении определенного времени (например, 3 часа) с момента его бронирования. Как мне это сделать?
если это плохой дизайн (он пахнет как один ..) как мне автоматически пометить таблицу booked/Free
, используя эту информацию / поля, доступные в их соответствующих моделях?
Ответ №1:
Если вам действительно нужно обновить такие данные на уровне базы данных, решением будет использование cronjobs, но это означает покинуть домен Django.
Обычно такая необходимость не возникает, поскольку часто значение информации полезно на уровне приложения, а не на уровне базы данных. Это означает, что вы должны оценить, сколько времени прошло, или если прошедшее время выше / ниже порогового значения в функции просмотра или функции модели.
Элегантным решением для этого было бы добавить свойство в вашу модель и удалить поле is_booked:
@property
def is_booked(self):
time_treshold_in_hours = 3
booked_datetime = datetime.strptime('{} {}'.format(self.booked_date, self.booked_time), '%Y-%m-%d %H:%M')
booked_deltatime = datetime.now() - booked_datetime
return booked_deltatime.seconds // 3600 > time_treshold_in_hours
и в представлении, которое вы оцениваете, забронирован ли столик, вы можете сделать:
def book_table(request):
# <get table>
if table.is_booked:
return HttpResponse('This table is booked already')
# <do your booking>
Я бы также рекомендовал изменить поля booked_date и booked_time на:
booked_on = models.DecimalField()
Комментарии:
1. привет, спасибо за ваше время. итак, я попытался проверить вашу функцию, но не смог получить требуемые результаты. но, допустим, я настраиваю эту функцию в соответствии со своими потребностями, и она начинает работать, где бы я это реализовал или как я мог бы гарантировать, что эта функция запускается каждые 3 часа или около того? Я не могу удалить поле из базы данных, потому что, на мой взгляд, оно используется для проверки, забронирован ли стол или нет. в зависимости от его значения отображается либо красный, либо зеленый рисунок таблицы. то же поле используется в форме бронирования, где я проверяю, не забронирован ли стол, затем оно отображается в форме «выбрать стол для бронирования»
2. Привет, удаление поля is_booked из вашей модели и создание
@property
функции не нарушит ваши представления. Вероятно, вам не нужно периодически что-либо запускать, вы можете проверить, забронирован ли столик (т. Е. Прошло ли определенное время с момента бронирования) по требованию, Представленное@property
должно выполнить эту проверку