(DRF) 为什么当 unique=True 时在创建之前进行查询?

(DRF) Why make a query before create when unique=True?

我有用户模型和代表它的序列化器class。

class User(models.Model):
username = models.CharField(unique=True, max_length=50)
is_admin = models.BooleanField(default=False)
class CreateUserSerializer(serializers.ModelSerializer):
    class Meta:
       model = User
       fields = (“username”, “is_admin”)

def create(self, validated_data: Dict[str, Any]) -> User:
    username = validated_data["username"]

    try:
        user_object = User.objects.create(username=username)
    except IntegrityError:
        raise UserAlreadyRegistered()

    return user_object

我的数据库拥有大量用户(大约 1000 万)。当我创建另一个用户时,Django Rest Framework 查看模型字段并检查是否有任何 unique=True 字段。如果有,则分配“UniqueValidator”。这个验证器调用“filter_queryset”,这意味着它查询数据库并检查是否有任何给定的用户名记录。如果没有,则创建用户。

我的问题是,为什么 DRF 在创建操作之前进行查询?由于数据库(PostgreSQL)拥有字段属性,它知道用户名字段是唯一的,如果我尝试使用相同的用户名字段创建用户,它会抛出异常。我问它的原因是,我的应用程序有很多创建操作,每个创建操作我都必须查询我的数据库,我认为这比不进行过滤器查询就创建它的成本更高。我在这个操作中遗漏了什么吗?

谢谢!

DRF 验证唯一性,如果不是,它会引发 ValidationError,通常 returns 4xx 消息错误。数据库唯一性检查 returns 5xx 错误,即服务器错误,如果不处理,默认情况下不处理。

因此最好在提交数据库事务之前检查唯一性。服务器错误(500 左右)不应在生产时发生。