[英](DRF) Why make a query before create when unique=True?
我有用户 model 和序列化程序 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 框架查看 model 字段并检查是否有任何 unique=True 字段。 如果有,则分配“UniqueValidator”。 这个验证器调用“filter_queryset”,这意味着它查询数据库并检查是否有任何给定的用户名记录。 如果没有,则创建用户。
我的问题是,为什么 DRF 在创建操作之前进行查询? 由于数据库(PostgreSQL)拥有字段属性,它知道用户名字段是唯一的,如果我尝试使用相同的用户名字段创建用户,它可能会引发异常。 我问它的原因是,我的应用程序有很多创建操作,并且每个创建操作我都必须查询我的数据库,我认为这比在不进行过滤查询的情况下创建它的成本更高。 我在这个操作中遗漏了什么吗?
谢谢!
如果不是,DRF 会验证唯一性,它会引发ValidationError
,通常会返回4xx
错误和消息。 数据库唯一性检查返回5xx
错误,即如果不处理服务器错误,默认情况下不处理。
因此最好在提交数据库事务之前检查唯一性。 服务器错误( 500
ish)不应在生产中发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.