Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework 序列化程序上的UniqueValidator与唯一模型约束_Django Rest Framework - Fatal编程技术网

Django rest framework 序列化程序上的UniqueValidator与唯一模型约束

Django rest framework 序列化程序上的UniqueValidator与唯一模型约束,django-rest-framework,Django Rest Framework,我目前有一个用户名字段上有唯一约束的用户模型。我的理解是,我可以在序列化程序的username字段上添加一个UniqueValidator,或者在我保存模型并处理它时让数据库抛出IntegrityError 似乎在序列化程序上添加UniqueValidator只会创建额外的查询,性能会更差,但是有没有充分的理由在序列化程序上执行所有验证,而不仅仅是让数据库抛出错误?绝对有理由。在DRF中,序列化程序负责两件事: [反]序列化数据,以便dict模型 验证数据 验证非常重要。这有效地使序列化程序成为

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


似乎在序列化程序上添加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,这仍然可能失败。检查唯一性可以简单地降低失败的风险,并允许请求更加原子化,同时减少数据库维护开销