DRF - проверка на конкретное уникальное нарушение ограничения при создании и / или проверке объекта - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть таблица, в которой составной уникальный индекс установлен как на уровне БД, так и на уровне Django. Первый вопрос: как мне узнать в DRF, что IntegrityError поднялся именно из-за этого уникального нарушения ограничения?

Я наткнулся на фрагмент кода, подобный следующему:

class TestModel(models.Model):
    class Meta:
        managed = False
        db_table = 'test_table'
        unique_together = ('fieldA','fieldB',)

class TestSerializer(serializers.ModelSerializer):

    def create(self, request, *args, **kwargs):
        try:
            return super().create(request, *args, **kwargs)
        except IntegrityError as err:
            if err.__cause__.pgcode == errorcodes.UNIQUE_VIOLATION:
                # Do something special

. ... но это дает, и, кроме того, я чувствую, что это не самый подходящий способ для достижения цели. Любые идеи?

И второй вопрос: как мне проверить это ограничение? Как должно выглядеть условие if в методе validate? И это должно быть сделано в методе проверки или в другом месте?

1 Ответ

1 голос
/ 18 февраля 2020

Каждый тип проверки должен выполняться в методах проверки DRF, т.е. validate и is_valid. Для вашего случая вы должны проверить в вашем методе validate, если какой-либо объект уже существует против предоставленных данных, подобных этому

def is_valid(self, raise_exception=True):
    data = self.initial_data
    if TestModel.objects.filter(fieldA=data.get('fieldA'), fieldB=data.get('fieldB').exists():
        raise serializers.ValidationError("Object already exist with {fieldA} and {fieldB}".format(**data)
    return super().is_valid(raise_exception)
...