Size: a a a

Django [ru] #STAY HOME

2020 February 02

DN

Denis Nikolaev in Django [ru] #STAY HOME
Подскажите пожалуйста, каким образом можно передать в валидатор значение валидируемого поля?
 def validate_date(date, year, month):
   if date < datetime.datetime(year=year, month=month, day=1):
       raise ValidationError('Date cannot be earlier than year and month')


class Common(models.Model):
   MONTH = (
       (1, 'January'),
       (2, 'February'),
       (3, 'March'),
       (4, 'April'),
       (5, 'May'),
       (6, 'June'),
       (7, 'July'),
       (8, 'August'),
       (9, 'September'),
       (10, 'October'),
       (11, 'November'),
       (12, 'December'),
   )
   month = models.IntegerField(choices=MONTH)
   year = models.IntegerField(choices=zip(range(2015, 2021), range(2015, 2021)))
   date = models.DateTimeField(validators=[validate_date])

   def __str__(self):
       return '%s %s' % (self.date, self.month)

   class Meta:
       abstract = True
       unique_together = ('month', 'year')
источник

DN

Denis Nikolaev in Django [ru] #STAY HOME
я могу передать в validate_date (month, year), но не понимаю как передать date
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Denis Nikolaev
я могу передать в validate_date (month, year), но не понимаю как передать date
а разве не наоборот, в валидатор приедет date, но не приедет month/year?
источник

DN

Denis Nikolaev in Django [ru] #STAY HOME
Pavel Zagrebelin
а разве не наоборот, в валидатор приедет date, но не приедет month/year?
Да, но мне нужно в валидаторе сравнить date с month и year. Если я вызываю validate_date без параметров, то в него передается только date, а если я вызываю его с month и year, то в него не передается date.
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Denis Nikolaev
Да, но мне нужно в валидаторе сравнить date с month и year. Если я вызываю validate_date без параметров, то в него передается только date, а если я вызываю его с month и year, то в него не передается date.
Прикольно. Это в какой джанге так? Потому что в 2.2 вот так выглядит код валидации:
        for v in self.validators:
           try:
               v(value)
           except exceptions.ValidationError as e:
               ...
источник

DN

Denis Nikolaev in Django [ru] #STAY HOME
Pavel Zagrebelin
Прикольно. Это в какой джанге так? Потому что в 2.2 вот так выглядит код валидации:
        for v in self.validators:
           try:
               v(value)
           except exceptions.ValidationError as e:
               ...
Вы имеете ввиду это -
 def run_validators(self, value):
       if value in self.empty_values:
           return
       errors = []
       for v in self.validators:
           try:
               v(value)
           except ValidationError as e:
               if hasattr(e, 'code') and e.code in self.error_messages:
                   e.message = self.error_messages[e.code]
               errors.extend(e.error_list)
       if errors:
           raise ValidationError(errors)
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Denis Nikolaev
Вы имеете ввиду это -
 def run_validators(self, value):
       if value in self.empty_values:
           return
       errors = []
       for v in self.validators:
           try:
               v(value)
           except ValidationError as e:
               if hasattr(e, 'code') and e.code in self.error_messages:
                   e.message = self.error_messages[e.code]
               errors.extend(e.error_list)
       if errors:
           raise ValidationError(errors)
угу
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
в моём понимании, ваш код должен умереть с  TypeError: validate_date missing N required positional arguments
источник

DN

Denis Nikolaev in Django [ru] #STAY HOME
Pavel Zagrebelin
в моём понимании, ваш код должен умереть с  TypeError: validate_date missing N required positional arguments
он умирает с
validate_date() missing 2 required positional arguments: 'year' and 'month'
источник

DN

Denis Nikolaev in Django [ru] #STAY HOME
Pavel Zagrebelin
в моём понимании, ваш код должен умереть с  TypeError: validate_date missing N required positional arguments
может воспользоваться pre save
источник

PZ

Pavel Zagrebelin in Django [ru] #STAY HOME
Denis Nikolaev
может воспользоваться pre save
эксепешны, вываленные в save, не обрабатываются формой, насоклько я помню
источник

L

Lee in Django [ru] #STAY HOME
Добрый вечер, подскажите, создаю объект через drf, и как если объект уже существует(стоит уникальное поле email) возвращать его опиасание, сейчас приходит просто пустой ответ со статусом 200
источник

A

Andrey in Django [ru] #STAY HOME
Lee
Добрый вечер, подскажите, создаю объект через drf, и как если объект уже существует(стоит уникальное поле email) возвращать его опиасание, сейчас приходит просто пустой ответ со статусом 200
Это противоречит концепции REST
источник

L

Lee in Django [ru] #STAY HOME
да, но как тогда правильно
источник

A

Andrey in Django [ru] #STAY HOME
Я бы вернул ошибку 409
источник

L

Lee in Django [ru] #STAY HOME
я создаю пользователя, если он уже сущствует мне нужны данные его
источник

L

Lee in Django [ru] #STAY HOME
а это еще один запрос с клиента
источник

L

Lee in Django [ru] #STAY HOME
может как нибудь можно возвращать описание объекта, со статусом 200,
источник

L

Lee in Django [ru] #STAY HOME
201 занчит новый создали
источник

A

Andrey in Django [ru] #STAY HOME
Мб и можно
Конкретную реализацию я не скажу. Чисто концептуально сейчас пишу.
источник