Qual é a melhor maneira de representar uma agenda em um banco de dados, via Python / Django?

votos
0

Estou escrevendo um sistema de backup em Python, com um front-end Django. Eu decidi implementar o agendamento de uma forma um pouco estranha - o cliente irá consultar o servidor (a cada 10 minutos ou mais), para uma lista de backups que precisam fazer. O servidor só responderá quando a hora de backup é alcançado. Esta é manter o sistema de plataforma independente - para que eu não confie em cronjobs ou afins. Portanto, o front-end Django (que expõe uma API XML-RPC) tem para armazenar a programação em um banco de dados, e interpretar essa programação para decidir se um cliente deve iniciar o backup ou não.

Actualmente, a programação é armazenado usando 3 campos: dias, horas e minutos. Estes são separados por vírgulas listas de números inteiros, que representam os dias da semana (0-6), as horas do dia (0-23) e de minutos a horas (0-59). Para decidir se um cliente deve iniciar o backup ou não é uma operação horrivelmente ineficiente - Python deve varrer todos os dias desde que um tempo 7-dias no passado, então as horas, depois os minutos. Tenho feito alguma otimização para ter certeza que não loop muito - mas ainda!

Isso funciona relativamente bem, embora a implementação é muito feio. O problema que tenho é como apresentar e interpretar esta informação através do formulário HTML no front-end. Atualmente eu só tenho enormes listas de campos de seleção múltipla, o que obviamente não funciona bem.

Alguém pode sugerir um método diferente para implementar a agenda que seria mais eficiente, e também mais fácil para representar em um formulário HTML?

Publicado 06/03/2009 em 17:56
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Dê uma olhada em django-cronógrafo . Ele tem uma interface muito agradável para o agendamento de postos de trabalho em todos os tipos de intervalos. Você pode ser capaz de emprestar algumas ideias do que isso. Ele se baseia em python-dateutil , que você também pode achar útil para especificar eventos repetidos.

Respondeu 06/03/2009 em 18:39
fonte usuário

votos
0

Sua pergunta é um pouco ambígua-você quer dizer: "Voltar a cada domingo, segunda e sexta-feira na hora do X." ?

Se assim for, usa um Bitmask para armazenar a programação recorrentes como um número inteiro:

Vamos dizer que você quer uma cópia de segurança, como mencionado acima Aos domingos, segundas e sextas-feiras. Codificar os dias da semana como um número inteiro (representado em binário):

S M T W T F S
1 1 0 0 0 1 0 = 98

Para descobrir se hoje (. Por exemplo, sexta-feira) é um dia de backup, basta fazer um bit a bit and:

>>> 0b1100010 & 0b0000010 != 0
True

Para obter o dia atual como um inteiro, você precisa compensá-la por um desde weekday()assume semana começa na segunda-feira:

current_day = (timezone.now().weekday() + 1) % 7

Em resumo, o esquema para o seu Scheduleobjeto seria algo parecido com:

class Schedule(models.Model):
    days_recurrence = models.PositiveSmallIntegerField(db_index=True)
    time = models.TimeField()

Com este esquema, você precisaria de um novo Scheduleobjeto para cada hora do dia você gostaria de back-up. Esta é uma pesquisa rápida desde a operação bit a bit custa cerca de 2 ciclos e desde que você está indexando o campo days_recurrence, você tem um pior caso dia-lookup de O(logn)que deve reduzir a sua complexidade consideravelmente. Se você quiser espremer mais desempenho fora disso, você também pode usar uma máscara de bits para uma hora , em seguida, armazenar o minuto.

Respondeu 17/05/2016 em 14:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more