我試圖為django模型創建自定義欄位。我需要存盤一周中每一天的營業時間。
class Restaurant(models.Model)。
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
city = models.CharField(max_length=15)
street = models.CharField(max_length=15)
house_number = models.CharField(max_length=3)
flat_number = models.CharField(max_length=3, default='0')
phone_number = models.CharField(max_length=12)
影像 = models.ImageField()
rating = models.FloatField(validators=[validate_rating_number])
def __str__(self):
return f'{self.name}, {self.city}'
我必須在一個欄位中存盤開放時間,例如
opening_hours = models.CustomField()
uj5u.com熱心網友回復:
如果你不想要一個單獨的表,并且你使用的是postgreSQL資料庫,你可以將時間欄位與陣列欄位相結合。它看起來會是這樣的。
from django.contrib.postgres.fiiles import ArrayField
from django.db import models
class Restaurant(models.Model)。
opening_hours = ArrayField(models.TimeField(), size=7)
然后你將使用一個索引訪問一周中任何一天的時間。假設周日是一周的第一天,你可以用
訪問周二的營業時間。restaurant.open_hours[2] # Sunday = 0, Monday = 1
為了擴展這個想法,你可以在Restaurant模型中添加帶名字的索引,這樣在你的代碼中就會更明顯地看到你到底得到了什么。
from django.contrib.postgres.fiiles import ArrayField
from django.db import models
class Restaurant(models.Model)。
SUN, MON, TUE, WED, THU, FRI, SAT = 0, 1, 2, 3, 4, 5, 6.
opening_hours = ArrayField(models.TimeField(), size=7)
r = Restaurant.objects.first()
r.open_hours[r.TUE]。
uj5u.com熱心網友回復:
你可以定義你自己的自定義欄位,它將保存每天的所有開放時間。在這里,我們將使用一個OpeningHours類,它將保存每天的開放時間,型別為datetime.time,這意味著輸入一個無效的時間,例如12:61將無法進行驗證。然后,我們將把它作為一個空格分隔的字串存盤到資料庫欄位opening_hours,例如:
12: 00 15: 00 18: 00 18:30 09: 00 12: 00 08:45
我們需要做的是配置:
。- 通過
get_prep_value()將自定義欄位從一個 - 通過
from_db_value()從資料庫中檢索自定義欄位,從那個空間分隔的字串到
OpeningHours型別的實體保存到資料庫中,即每天的次數的空格分隔的字串。
OpeningHours的實體。
models.py
from datetime import datetime
from django.core.exceptions import ValidationError
class OpeningHours:
FORMAT = '%H:%M'。
def __init__(self, mon, tue, wed, thu, fri, sat, sun)。
self.mon = datetime.strptime(mon, self.FORMAT).time()
self.tue = datetime.strptime(tue, self.FORMAT).time()
self.wed = datetime.strptime(wed, self.FORMAT).time()
self.thu = datetime.strptime(thu, self.FORMAT).time()
self.fri = datetime.strptime(fri, self.FORMAT).time()
self.sat = datetime.strptime(sat, self.FORMAT).time()
self.sun = datetime.strptime(sun, self.FORMAT).time()
def __str__(self):
return ' '/span>.join(
dt_time.strftime(self.FORMAT)
for dt_time in (
self.mon,
self.tue,
self.wed,
self.thu,
self.fri,
self.sat,
self.sun。
)
)
class OpeningHoursField(models.CharField)。
描述 = "每天的開放時間"。
def from_db_value(self, value, expression, connection)。
return self.to_python(value)
def to_python(self, value)。
if value is None or isinstance(value, OpeningHours)。
return value
try:
obj = OpeningHours(*value.split())
except 例外。
raise ValidationError("Invalid opening time")
else:
return obj
def get_prep_value(self, value)。
return str(value)
class Restaurant(models.Model)。
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=30)
city = models.CharField(max_length=15)
opening_hours = OpeningHoursField(max_length=100)
def __str__(self):
return f'{self.name}, {self.city}'
創建一個新的Restaurant將需要一個OpeningHours物件被設定為自定義的opening_hours欄位:
>>> from my_app.model import *
>>> opening_hours = OpeningHours(mon="12:00"/span>, tue="15:00"/span>, wed="18: 00", thu="18:30", fri="09:00", sat="12:00", sun="08:45")
>>> obj = Restaurant.objects.create(name="Burger King"/span>, city="London"/span>, opening_hours=opening_hours)
>>> obj.save()
>>> obj.__dict__
{'_state': <django.db.models.base.ModelState object at 0x7fe3c5b4cb50> ,'id': 1, 'name': 'Burger King', 'City': 'London', 'open_hours': <my_app.models.OpeningHours object at 0x7fe3c5b4c1f0>}。
讀取Opening_hours欄位就像讀取一個普通的OpeningHours物件:
>>> print(obj.open_hours)
12:00 15: 00 18: 00 18: 30 09:00 12: 00 08:45
>>> obj.open_hours.mon
datetime.time(12, 0)
>>> obj.open_hours.tue
datetime.time(15, 0)
>>> obj.open_hours.wed
datetime.time(18, 0)
>>> obj.open_hours.thu
datetime.time(18, 30)
>>> obj.open_hours.fri
datetime.time(9, 0)
>>> obj.open_hours.sat
datetime.time(12, 0)
>>> obj.open_hours.sun
datetime.time(8, 45)
要更新某一天的時間,只需更新相應的欄位并保存。
>>> # Display old value
>>> print(Restaurant.objects.first().open_hours)。
12:00 15: 00 18: 00 18: 30 09:00 12: 00 08:45
>>> print(Restaurant.objects.first().open_hours.tshu)
18:30:00。
>>>。
>>> # 更新周四的新值并保存。
>>> obj.open_hours.thu = datetime.time(hour=1, minute=23)
>>> obj.save()
>>>
>>> # 顯示更新的值。
>>> print(Restaurant.objects.first().open_hours)。
12:00 15:00 18: 00 01: 23 09:00 12: 00 08:45
>>> print(Restaurant.objects.first().open_hours.thu)
01:23:00。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/332351.html
標籤:
下一篇:Regex在雙引號中分割字串
