Django,管理面板的唯一时间间隔

时间:2010-02-11 09:36:27

标签: django django-models django-admin

问候, 假设我有这样的模型:

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

对于具有相同类型的每个Foo对象,我需要此时间间隔(end_time - start_time)是唯一的,以便创建具有冲突间隔的第二个Foo是不可能的。如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

请参阅管理界面中有关custom validation的文档。

基本上你必须创建自己的(模型)表单,让我们说CustomFooAdminForm并将其分配给管理模型:

class FooAdmin(admin.ModelAdmin):
    form = CustomFooAdminForm

并且在表格中你可以有类似的东西(见custom validation in forms):

# 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转换为UNIX时间戳,然后才能在SQL中删除它们(MySQL UNIX_TIMESTAMP(time_end) - UNIX_TIMESTAMP (time_start))。或者您可以在MySQL中使用DATEDIFF()来获得差异。但请注意,如果您使用此类特殊功能,则将应用程序绑定到某个数据库(只要它们在同名的其他数据库中不可用)。