2016-07-17 20 views
0

Ich versuche, Pay in einem Djando-Modell zu verfolgen, aber dies könnte jährlich, täglich oder stündlich sein, so dass Werte für RangeMinValueValidator und RangeMaxValueValidator von pay_type abhängen sollten, aber ich bin mir nicht sicher, wie dies zu tun ist. Was ich habe, so weit:Wie kann ich in einem Django-Modell Werte für Django-Validierer basierend auf einem anderen Feld festlegen?

PAY_TYPE = Choices(
    ('annual', _('Annual')), 
    ('daily', _('Daily')), 
    ('hourly', _('Hourly')), 
) 

pay_range = models.IntegerRangeField(
    bounds='[]', 
    validators=[ 
     RangeMinValueValidator(1), 
     RangeMaxValueValidator(9999999) 
    ] 
) 
pay_type = models.CharField(choices=PAY_TYPE, default=PAY_TYPE.annual) 

EDIT:

Das fühlt sich ziemlich chaotisch, aber so weit, nach Daniel Roseman Kommentar:

def clean(self): 
    # Validate pay_range min and max 
    annual_pay_range_minimum = 13000 
    annual_pay_range_maximum = 9999999 
    daily_pay_range_minimum = 25 
    daily_pay_range_maximum = 10000 
    hourly_pay_range_minimum = 6 
    hourly_pay_range_maximum = 500 

    if self.pay_type is 'annual': 
     pay_range_minimum = annual_pay_range_minimum 
     pay_range_maximum = annual_pay_range_maximum 
    elif self.pay_type is 'daily': 
     pay_range_minimum = daily_pay_range_minimum 
     pay_range_maximum = daily_pay_range_maximum 
    elif self.pay_type is 'hourly': 
     pay_range_minimum = hourly_pay_range_minimum 
     pay_range_maximum = hourly_pay_range_maximum 
    if (self.pay_range.lower < pay_range_minimum) or (self.pay_range.upper > pay_range_maximum): 
     raise ValidationError({ 
      'pay_range': ValidationError(
       _('%(pay_type)s Pay must be between %(pay_range_minimum)s and %(pay_range_maximum)s'), 
       code='invalid', 
       params={ 
        'pay_type': self.pay_type, 
        'pay_range_minimum': pay_range_minimum, 
        'pay_range_maximum': pay_range_maximum, 
       }, 
      ) 
     }) 

Antwort

1

Sie können nicht tun, mit einem Feld-Validator . Definieren Sie stattdessen die clean-Methode im Modell, um die Feldwerte zu überprüfen und ggf. ValidationError zu erhöhen.

+0

Danke, ich habe einen Versuch zusammen in der Frage gestellt, obwohl es einen aufgeräumteren Weg geben muss, es zu tun. Muss clean() in save() aufgerufen werden, wenn es bei jedem Speichern ausgeführt werden soll? – StringsOnFire

+0

Ich rufe clean() in einer pre_save-Methode auf. – StringsOnFire