Django rest framework 序列化程序上的UniqueValidator与唯一模型约束
我目前有一个用户名字段上有唯一约束的用户模型。我的理解是,我可以在序列化程序的username字段上添加一个UniqueValidator,或者在我保存模型并处理它时让数据库抛出IntegrityErrorDjango rest framework 序列化程序上的UniqueValidator与唯一模型约束,django-rest-framework,Django Rest Framework,我目前有一个用户名字段上有唯一约束的用户模型。我的理解是,我可以在序列化程序的username字段上添加一个UniqueValidator,或者在我保存模型并处理它时让数据库抛出IntegrityError 似乎在序列化程序上添加UniqueValidator只会创建额外的查询,性能会更差,但是有没有充分的理由在序列化程序上执行所有验证,而不仅仅是让数据库抛出错误?绝对有理由。在DRF中,序列化程序负责两件事: [反]序列化数据,以便dict模型 验证数据 验证非常重要。这有效地使序列化程序成为
似乎在序列化程序上添加UniqueValidator只会创建额外的查询,性能会更差,但是有没有充分的理由在序列化程序上执行所有验证,而不仅仅是让数据库抛出错误?绝对有理由。在DRF中,序列化程序负责两件事: [反]序列化数据,以便dict模型 验证数据 验证非常重要。这有效地使序列化程序成为数据库的网关。它检查数据,如果数据不好,它编译可以返回给用户的错误。如果数据有效,则可以进一步使用序列化程序与数据库交互,例如创建/更新模型。然而,这也有影响。现在让我们假设您的序列化程序具有嵌套的序列化程序:
class FooSerializer(Serializer):
...
class BarSerializer(Serializer):
foo = FooSerializer()
def create(self, validated_data):
foo = self.fields['foo'].create(validated_data['foo'])
# create bar here
若BarSerializer并没有强制某个字段的唯一性,那个么在其创建中,可以在创建bar之前创建foo,这可能会由于唯一性冲突而在数据库中失败。这是不希望的,因为REST请求应该是原子请求,请求应该成功或失败,但决不能部分成功。但是,有一些方法可以通过使用db事务来处理,这可能会带来不必要的复杂性。然而,若在序列化程序中强制执行唯一性,那个么创建bar失败的可能性要小得多。请注意,在并发应用程序中,两个请求试图同时执行相同的操作,而第一个请求在第二个请求的foo序列化程序之间创建bar,从而验证数据并保存bar,这仍然可能失败。检查唯一性可以简单地降低失败的风险,并允许请求更加原子化,同时减少数据库维护开销