簡體   English   中英

如何在經過特定時間后自動將特定字段標記為 False 或 true?

[英]How to automatically mark a specific field either False or true after certain time has been elapsed?

我正在 Django 3.xx 中創建一個酒店預訂 Web 應用程序

我有一個帶有isBooked字段的Table模型, isBooked字段根據表狀態設置為FalseTrue 此模型的代碼:

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其中包含存儲在變量中的以下信息:

  1. booked_time這包含一個字符串,用於顯示預訂餐桌的時間,例如7:00
  2. checkout_time這包含一個時間字符串,顯示何時應該騰空/退房,例如10:00

因此,基於上述變量,我想在isBooked后經過特定時間(例如 3 小時)后自動將表的isBooked屬性標記為False 我如何擺脫這樣的事情?

如果這是糟糕的設計(它聞起來像……)我如何使用各自模型中可用的信息/字段自動標記已booked/Free的桌子?

如果您確實需要在數據庫級別更新此類數據,則解決方案是使用 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM