Пользовательские сообщения об ошибках в зависимости от состояния объекта - PullRequest
0 голосов
/ 11 октября 2018

Как, например, у меня есть модель с несколькими статусами.

class Task(models.Model):
    TO_DO = 'to_do'
    IN_PROGRESS = 'in_progress'
    DONE = 'done'
    TASK_STATUSES = (
        (TO_DO, _('To do')),
        ...
    )
    status = models.CharField(max_length=256, choices=TASK_STATUSES)
    creator = models.ForeignKey('user.User', on_delete=models.CASCADE)

    def is_to_do(self):
        return self.status == self.TO_DO

    def is_in_progress(self):
        return self.status == self.IN_PROGRESS

     def is_done(self):
        return self.status == self.DONE

И у меня есть конечная точка, где я хочу выполнить действие по моей задаче.Перед этим я хочу проверить, разрешено ли выполнять это действие в зависимости от состояния объекта и других вещей.У меня может быть несколько if statements вроде:

obj = get_object()
if object.is_in_progress() and object.creator.name = '...':
    raise NotAcceptable(detail=_('...'))
if ...
...
else: 
    obj.update_status()

Каждое исключение может иметь свое собственное сообщение об ошибке.Я могу хранить эти сообщения на модели, но у меня все еще есть много if, которые только вызывают исключение.Итак, каков наилучший способ выполнить такие проверки и сохранить мой API-интерфейс в чистоте?

1 Ответ

0 голосов
/ 11 октября 2018

Я хотел бы поделиться своей идеей, которая может быть решением вашей проблемы.

status_message = None
error_type = None
try:
    # update/implement what you want
    print(1/0)
except Exception as ex:
    status_message = ex
    error_type = ex.__class__.__name__
    # get the status model by your exception
    model_obj = your_model.objects.get(error_type=error_type)
    if model_obj == None or model_obj.id == None:
        # if status model has not entry than created new one and than response.
        your_model.save(status_message=status_message, error_type=error_type)
        raise Response(your_model.__dict__) # you may serialize your response
    raise Response(model_obj.__dict__)

Примечание: писать код в блоге except - это плохая практика.

...