Лучший способ сохранить доступность пользователя по дням недели в python / django - PullRequest
5 голосов
/ 02 марта 2011

Я хочу сохранить пользовательские настройки для дней, в которые он может быть доступен. например Пользователь может быть доступен в субботу, воскресенье, но не в другие дни. В настоящее время я использую массив из 7 флажков (значения = 1,2, ... 7), чтобы пользователь мог выбрать отдельные дни своей доступности.

Теперь первый вопрос: как я могу сохранить это в базе данных. Я думаю об использовании строки (длина = 7) и сохранении предпочтений, таких как 1100010, где 1 будет означать доступным, а 0 - недоступным. Это хорошая практика?

Второй вопрос, как я могу преобразовать данные POST (["1", "2", "7"]) в строку (1100010)

Ответы [ 6 ]

2 голосов
/ 02 марта 2011

1-е - хорошее решение, я делаю аналогично. 2-й - вам следует подумать о том, чтобы каждый день назначать степень 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)]) 
2 голосов
/ 02 марта 2011

Я нашел эту реализацию BitField Дэвида Крамера, которая должна делать то, что вы хотите. Выглядит очень красиво.

1 голос
/ 02 марта 2011

Еще один вариант является более или менее очевидным: определите таблицу дней недели, и пусть ManyToManyField отобразит один на другой. Администратор просто работает, вы можете выполнять поиск по датам, и он работает на SQLite, в отличие от некоторых функций в django-bitfield. Поиск может быть быстрым, так как они находятся в базе данных, и вам не нужно использовать SQL LIKE (который игнорирует индексы, если в начале строки есть символы подстановки, как в случае CommaSeparatedIntegerField или строка из семи символов).

Конечно, это занимает больше места, но сколько у вас пользователей? Миллионы?

P.S. если у вас есть поле заказа в вашей таблице дней недели, вы можете также сделать сортировку базы данных по дням недели для вас с чем-то вроде queryset.order_by('available__order').

1 голос
/ 02 марта 2011

Другой вариант - хранить его как целые числа через запятую. Для этого в Django есть встроенное поле: http://docs.djangoproject.com/en/1.2/ref/models/fields/#commaseparatedintegerfield

1 голос
/ 02 марта 2011

Это довольно сложно, но, учитывая, что дни недели не будут меняться, ваш дальнейший код может быть более понятным, если вы добавите столбец с названием каждого дня в таблицу доступности с 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 голосов
/ 02 марта 2011

Я бы пошел на отдельные логические столбцы .

Вам будет гораздо проще, скажем, запрашивать пользователей, которые доступны по понедельникам; или для подсчета количества пользователей, которые доступны через каждый будний день, или что-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...