序列化器上的UniqueValidator与唯一模型约束

时间:2015-08-03 16:49:39

标签: django-rest-framework

我目前在用户名字段中有一个具有唯一约束的用户模型。我的理解是我可以在序列化程序的用户名字段中添加一个UniqueValidator,或者只是让我在保存模型然后处理它时让数据库抛出一个IntegrityError。

似乎在序列化程序中添加UniqueValidator只会创建额外的查询并且性能会更差,但是有充分的理由在序列化程序上进行所有验证而不是让数据库抛出错误吗?

1 个答案:

答案 0 :(得分:-1)

绝对。在DRF中,序列化器负责两件事:

  1. [de]序列化数据,以便dict <-> model
  2. 验证数据
  3. 验证非常重要。这有效地使序列化程序成为数据库的入口。它检查数据,如果数据不好,它会编译可以返回给用户的错误。如果数据有效,则可以进一步使用序列化程序与db交互,例如创建/更新模型。然而这具有影响。现在假设您的序列化程序具有嵌套的序列化程序:

    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没有强制某个字段的唯一性,则可以在创建create之前创建foobar,因为唯一性而导致数据库失败违反。这是不希望的,因为REST请求应该是原子的(请求应该成功或失败但从不部分成功)。有一些方法可以通过使用db事务处理它,但这会带来不必要的复杂性。但是,如果在序列化程序中强制执行唯一性,则创建条形图失败的可能性要小得多。请注意,它仍然可以在并发应用程序中失败(两个请求同时尝试执行相同的操作,第一个请求在第二个请求的foo序列化程序验证数据和保存栏之间创建条形码)。检查唯一性只会降低失败的风险,并允许请求更加原子化,同时减少数据库维护开销。