繁体   English   中英

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

[英](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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM