2010-02-11 58 views
0

問候, 假設我有這樣的模型:Django中,用於管理面板唯一的時間間隔

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

對於被具有相同類型的每個Foo對象,我需要在該時間間隔(END_TIME - START_TIME)至是獨一無二的,因此創建第二個具有衝突間隔的Foo是不可能的。這怎麼能實現?

回答

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 s轉換爲UNIX時間戳,然後才能在SQL中扣除它們(針對MySQL的UNIX_TIMESTAMP(time_end) - UNIX_TIMESTAMP (time_start))。或者你可以在MySQL中使用DATEDIFF()來獲得差異。但是請注意,如果您使用此類特殊功能(只要它們在其他數據庫中不具有相同名稱),則可將您的應用程序綁定到某個特定數據庫。

+0

非常感謝您的詳細解釋!對於最後一部分(tim差異),我想timedelta可以用來代替unix時間技巧(但不確定:))。 – Hellnar 2010-02-11 12:54:37