在Python/Django中保存用户一周可用性的最佳方法

5 投票
6 回答
1922 浏览
提问于 2025-04-16 12:49

我想保存用户的可用时间,具体是他在一周中的哪几天可以有空。比如,一个用户可能在周六和周日有空,但其他日子就不行。

现在,我用一个包含7个复选框的数组(值分别是1, 2, ... 7),这样用户可以选择自己有空的具体日期。

第一个问题是,我该如何把这些信息存储到数据库里。我在考虑用一个长度为7的字符串来保存这些偏好,比如用1100010来表示,其中1表示有空,0表示没空。这样做是否合适呢?

第二个问题是,我该如何把POST数据(["1","2","7"])转换成字符串(1100010)呢?

6 个回答

2

我找到了一种由David Cramer实现的BitField,这个东西应该能满足你的需求。看起来非常不错。

3

第一点 - 这是个不错的解决方案,我的做法也差不多。
第二点 - 你可以考虑给每一天分配一个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

使用bin函数的问题在于,你需要在前面加上0,才能得到一个7个字符长的字符串,
不过你也可以自己写一个类似的版本,像这样:

bin = lambda n:"".join([str((n >> y) & 1) for y in range(7-1, -1, -1)]) 
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)

撰写回答