Django - предотвращение перекрытия диапазона дат - PullRequest
0 голосов
/ 22 марта 2012
class Session(models.Model):
  tutor = models.ForeignKey(User)
  start_time = models.DateTimeField()
  end_time = models.DateTimeField()

Каков наилучший способ предотвратить перекрытие start_time end_time?

1 Ответ

1 голос
/ 22 марта 2012

Во-первых, вы должны сделать это на уровне формы, см. Очистка и проверка полей, которые зависят друг от друга для получения инструкций о том, как это сделать, это будет выглядеть так:

def clean(self):
    cleaned_data = super(YourForm, self).clean()
    if cleaned_data['start_time'] > cleaned_data['end_time']:
        raise forms.ValidationError(_(u'Start time must be before end time'))

Кроме того, вы можете применить его на низком уровне в методе сохранения или в pre_save сигнале :

from django.db.models import signals

class StartTimeAfterEndTimeException(Exception):
    def __init__(self, model):
        super(StartTimeAfterEndTimeException, self).__init__(
            'Start time %s should not be after end time %s' % (
                model.start_time, model.end_time))

def session_force_end_time(sender, instance, **kwargs):
    if instance.start_time >= instance.end_time:
        raise StartTimeAfterEndTimeException(instance)
signals.pre_save.connect(session_force_end_time, sender=Session)

Но это довольно низкий уровень, поэтому он не удобен для пользователя.

...