2012-09-28 38 views
1

我有一個模型使用名爲CompareDates的驗證類,用於我的模型驗證器,並且我想通過驗證器兩個字段值。但是我不確定如何在驗證器中使用多個字段值。在django模型驗證器中可以使用多個值嗎?

我希望能夠在日期之間進行比較,以驗證整個模型,但它似乎並不像關鍵字傳遞給驗證器的值,或者我錯過了什麼?

from django.db import models 
from myapp.models.validators.validatedates import CompareDates 

class GetDates(models.Model): 
    """ 
    Model stores two dates 
    """ 
    date1 = models.DateField(
      validators = [CompareDates().validate]) 
    date2 = models.DateField(
      validators = [CompareDates().validate]) 

回答

4

「正常」驗證器將只獲取當前字段值。所以它不會做你想做的事情。但是,您可以添加一個乾淨的方法,和 - 如果需要應該是 - 覆蓋您保存這樣的方法:

class GetDates(models.Model): 
    date1 = models.DateField(validators = [CompareDates().validate]) 
    date2 = models.DateField(validators = [CompareDates().validate]) 
    def clean(self,*args,**kwargs): 
     CompareDates().validate(self.date1,self.date2) 
    def save(self,*args,**kwargs): 
     # If you are working with modelforms, full_clean (and from there clean) will be called automatically. If you are not doing so and want to ensure validation before saving, uncomment the next line. 
     #self.full_clean() 
     super(GetDates,self).save(*args,**kwargs) 
+1

繼文檔,清理將不會自動調用,但需要手動地方調用,例如保存方法。這並不能真正幫助500錯誤;但我已經修改了代碼。 – schacki

+0

非常感謝你:) –

+0

爲什麼它值得這個不會與Django Rest框架一起工作(我很想證明是錯誤的)。在模型的clean()中引發django.core.exceptions.ValidationError將引發500內部服務器錯誤。我見過的最佳解決方法是將django ValidationError更改爲rest_framework ValidationError並重新推出它。更多信息:https://github.com/encode/django-rest-framework/issues/2145 – Bosco

相關問題