Django rest framework DRF-在创建和/或验证对象时检查具体的唯一约束冲突

Django rest framework DRF-在创建和/或验证对象时检查具体的唯一约束冲突,django-rest-framework,Django Rest Framework,我有一个表,其中在DB和Django级别上都设置了复合唯一索引。第一个问题是,我如何在DRF中发现IntegrityError正是因为这个给定的唯一约束冲突而上升的 我遇到过这样的代码片段: class TestModel(models.Model): class Meta: managed = False db_table = 'test_table' unique_together = ('fieldA','fieldB',) cla

我有一个表,其中在DB和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条件应该是什么样子?是否应使用验证方法或其他方法进行验证?

每种类型的验证均应使用DRF验证方法进行,即
验证
是否有效
。对于您的情况,您应该在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)

如果您在模型级DRF中将
unique_设置在一起
,DRF将处理它。为什么要在那个地方捕捉
IntegrityError