(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
左右)不应在生产时发生。
我有用户模型和代表它的序列化器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
左右)不应在生产时发生。