问候, 假设我有这样的模型:
class Foo(models.Model):
type = models.ForeignKey(Type)
start_time = models.DateTimeField()
end_time models.DateTimeField()
对于具有相同类型的每个Foo对象,我需要此时间间隔(end_time - start_time)是唯一的,以便创建具有冲突间隔的第二个Foo是不可能的。如何实现这一目标?
答案 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()
来获得差异。但请注意,如果您使用此类特殊功能,则将应用程序绑定到某个数据库(只要它们在同名的其他数据库中不可用)。