Django, уникальный интервал времени для админки - PullRequest
0 голосов
/ 11 февраля 2010

Привет, Предположим, у меня есть такая модель:

class Foo(models.Model):
    type = models.ForeignKey(Type)
    start_time = models.DateTimeField()
    end_time models.DateTimeField()

Для каждого объекта Foo, имеющего один и тот же тип, этот интервал времени (end_time - start_time) должен быть уникальным, чтобы создание второго Foo с конфликтующим интервалом было невозможным. Как этого достичь?

1 Ответ

2 голосов
/ 11 февраля 2010

См. Документацию о пользовательской проверке в интерфейсе администратора.

По сути, вам нужно создать собственную (модель) форму, скажем, CustomFooAdminForm и назначить ее для модели администратора:

class FooAdmin(admin.ModelAdmin):
    form = CustomFooAdminForm

и в форме вы можете иметь что-то вроде (см. пользовательская проверка в формах ):

# more or less pseudo code
class CustomFooAdminForm(forms.ModelForm):

    def clean(self):
        cleaned_data = super(CustomFooAdminForm, self).clean()
        interval = cleaned_data.get("end_time") - cleaned_data.get("start_time")
        type = cleaned_data.get("type")

        q = Foo.objects.extra(select={'interval':'time_end - time_start'}
        counter = q.filter(interval=intervak, type=type).count()

        if counter > 0:
            raise forms.ValidationError("ERROR!!!!")

        # Always return the full collection of cleaned data.
        return cleaned_data

Возможно, вам придется преобразовать DateTimeField s в метки времени UNIX, прежде чем вы сможете вычесть их в SQL (UNIX_TIMESTAMP(time_end) - UNIX_TIMESTAMP (time_start) для MySQL). Или вы можете использовать DATEDIFF() в MySQL, чтобы получить разницу. Но обратите внимание, что вы привязываете свое приложение к определенной базе данных, если используете такие специальные функции (если они недоступны в других базах данных с тем же именем).

...