我想存儲用戶對可能可用的星期幾天的喜好。例如用戶可以在星期六,星期日,但不在其他日子。 目前我正在使用7個複選框(值= 1,2,... 7)數組,以便用戶可以選擇個別日期。在python/django中保存用戶可用性的最佳方法
現在第一個問題是我如何將它存儲在數據庫中。我正在考慮使用一個字符串(長度= 7)並存儲喜歡1100010其中1將表示可用和0不可用。這是不錯的做法嗎?
第二個問題,如何可以轉換POST數據([ 「1」, 「2」, 「7」])轉換成字符串(1100010)
我想存儲用戶對可能可用的星期幾天的喜好。例如用戶可以在星期六,星期日,但不在其他日子。 目前我正在使用7個複選框(值= 1,2,... 7)數組,以便用戶可以選擇個別日期。在python/django中保存用戶可用性的最佳方法
現在第一個問題是我如何將它存儲在數據庫中。我正在考慮使用一個字符串(長度= 7)並存儲喜歡1100010其中1將表示可用和0不可用。這是不錯的做法嗎?
第二個問題,如何可以轉換POST數據([ 「1」, 「2」, 「7」])轉換成字符串(1100010)
這是有點棘手,但考慮到平日不會改變,如果您將每天的名稱添加到您的可用性表中的0或1表示可用性,您的進一步的代碼可以更清楚。這看起來有點多餘,但將來更容易編碼和維護。
第二個問題,如何可以轉換POST數據([ 「1」, 「2」, 「7」])轉換成字符串(1100010)
week=['0']*7
for day in ["1","2","7"]:
week[int(day) - 1]='1'
week=''.join(week)
另一種選擇是隻將其存儲爲逗號分開的整數。 Django中有一個內置的領域爲:http://docs.djangoproject.com/en/1.2/ref/models/fields/#commaseparatedintegerfield
另外一個選擇是更多或更少明顯:定義一週的天表,並有ManyToManyField
映射一個到另一個。管理員只會工作,你可以根據日期進行搜索,它不像django-bitfield中的一些函數,它在SQLite上工作。搜索可以很快,因爲它們在數據庫中,並且不必使用SQL的LIKE
(如果在字符串的開始處有通配符,則忽略索引,這可能是CommaSeparatedIntegerField
或七個字符的字符串)。
當然,它需要更多的存儲空間,但是有多少用戶呢?百萬?
P.S.如果您的工作日表格中有訂購字段,則還可以按照日期爲您設置數據庫,並按照類似於queryset.order_by('available__order')
的方式進行排序。
我想去單獨的布爾列。
然後,您可以更輕鬆地查詢針對在星期一開放的用戶;或者統計每個工作日可用的用戶數量等。
1st - 很好的解決方案,我在做類似的工作。 2nd - 你應該考慮每天分配2的權力,這樣就可以很容易地使用bin()將這些數字轉換爲二進制,並且易於比較,你只需要做&。
>>> mon, tue, wed, thu, fri, sat, sun = (pow(2, i) for i in range(7))
>>> bin(mon)
'0b1'
>>> bin(sun)
'0b1000000'
# create range:
>>> x = mon | wed | fri
>>> bin(x)
'0b10101'
# check if day is in range:
>>> x & mon
1
>>> x & tue
0
有彬的問題是,你必須添加的0至開頭,以獲得7字符長的字符串, 但你也可以寫你自己的版本是這樣的:
bin = lambda n:"".join([str((n >> y) & 1) for y in range(7-1, -1, -1)])
我同意單獨的列會更清晰,但在這種情況下,我會讓他們布爾:P – 2011-03-02 13:59:31
這就是我的意思。 SQL布爾值只是一個0或1的小int,但我認爲這實際上取決於DB服務器。 – 2011-03-02 14:09:37
小錯誤更正:周[int(day)] ='1'實際上應該是周[int(day)-1] ='1' – Myth 2011-03-02 14:27:54