2011-03-02 42 views
4

我想存儲用戶對可能可用的星期幾天的喜好。例如用戶可以在星期六,星期日,但不在其他日子。 目前我正在使用7個複選框(值= 1,2,... 7)數組,以便用戶可以選擇個別日期。在python/django中保存用戶可用性的最佳方法

現在第一個問題是我如何將它存儲在數據庫中。我正在考慮使用一個字符串(長度= 7)並存儲喜歡1100010其中1將表示可用和0不可用。這是不錯的做法嗎?

第二個問題,如何可以轉換POST數據([ 「1」, 「2」, 「7」])轉換成字符串(1100010)

回答

1

這是有點棘手,但考慮到平日不會改變,如果您將每天的​​名稱添加到您的可用性表中的0或1表示可用性,您的進一步的代碼可以更清楚。這看起來有點多餘,但將來更容易編碼和維護。

第二個問題,如何可以轉換POST數據([ 「1」, 「2」, 「7」])轉換成字符串(1100010)

week=['0']*7 
for day in ["1","2","7"]: 
    week[int(day) - 1]='1' 
week=''.join(week) 
+0

我同意單獨的列會更清晰,但在這種情況下,我會讓他們布爾:P – 2011-03-02 13:59:31

+0

這就是我的意思。 SQL布爾值只是一個0或1的小int,但我認爲這實際上取決於DB服務器。 – 2011-03-02 14:09:37

+0

小錯誤更正:周[int(day)] ='1'實際上應該是周[int(day)-1] ='1' – Myth 2011-03-02 14:27:54

2

我發現這個實施BitField的由David克拉默,這應該做你想做的事。看起來很不錯。

+0

一些功能唐不適用於SQLite。這可能是也可能不是問題。 – 2011-03-02 14:05:42

1

另外一個選擇是更多或更少明顯:定義一週的天表,並有ManyToManyField映射一個到另一個。管理員只會工作,你可以根據日期進行搜索,它不像django-bitfield中的一些函數,它在SQLite上工作。搜索可以很快,因爲它們在數據庫中,並且不必使用SQL的LIKE(如果在字符串的開始處有通配符,則忽略索引,這可能是CommaSeparatedIntegerField或七個字符的字符串)。

當然,它需要更多的存儲空間,但是有多少用戶呢?百萬?

P.S.如果您的工作日表格中有訂購字段,則還可以按照日期爲您設置數據庫,並按照類似於queryset.order_by('available__order')的方式進行排序。

0

我想去單獨的布爾列

然後,您可以更輕鬆地查詢針對在星期一開放的用戶;或者統計每個工作日可用的用戶數量等。

2

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)]) 
相關問題