完整性错误 - UNIQUE 约束失败。我该如何处理?姜戈

问题描述 投票:0回答:1

我是 DRF 框架的新手,正在构建一个小项目。我想创建一个 User 实例(内置实例),同时在用户注册期间创建一个链接到它的 Seller 实例。

每当我尝试执行此操作时,Django 都会抛出完整性错误:UNIQUE 约束失败:seller_seller.user_id。

你们都可以帮我理解这个问题并解决它吗?

请询问是否需要更多信息。

模型.py

class Seller(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  seller_company_name = models.CharField(max_length=200)
  seller_contact = models.CharField(max_length=14, null=True)
  seller_email = models.EmailField(max_length=200, null=True)

  def __str__(self):
    return f"{self.id} --> {self.user.username}"

序列化器.py

class UserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(required=True)
    contact = serializers.CharField(max_length=15, required=True)
    cname = serializers.CharField(max_length=200, required=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'password', 'contact', 'cname']
        extra_kwargs = {'password': {'write_only': True}}

    def create(self, validated_data):
        try:
            user = User.objects.create_user(
                username=validated_data['username'],
                email=validated_data['email'],
                password=validated_data['password'],
            )
        except IntegrityError:
            raise serializers.ValidationError("Username or email already exists.")
        try:
            seller = Seller.objects.create(
                user=user,
                seller_contact=validated_data['contact'],
                seller_company_name=validated_data['cname'],
                seller_email=validated_data['email'],
            )
        except IntegrityError as e:
            user.delete()  # Rollback user creation if seller creation fails
            raise serializers.ValidationError("Failed to create seller.")

        return user

注册视图

@api_view(['POST'])
@permission_classes([AllowAny])
def signup_view(request):
    serializer = UserSerializer(data=request.data)
    if serializer.is_valid():
        user = serializer.save()
        if user:
            return Response(status=status.HTTP_201_CREATED)
    return Response(status=status.HTTP_400_BAD_REQUEST)

我尝试为他们制作单独的视图,但没有成功。

python-3.x django django-rest-framework django-views django-serializer
1个回答
0
投票

对序列化器中的创建方法有很多误解

  • create 负责(如何、什么)将数据存储在模型中
  • 密码保存技术实际上是将密码保存为纯文本,如果你进入 django admin 中的用户模型,很可能会找到密码:未知的哈希算法
  • IntegrityError 应该作为视图的响应而不是序列化器原因,因为我提到它不是序列化器作业

所以让我们修复一些行,但请记住,在我给你提供了继续前进的要点之后,你可能会遇到一些错误, 跟踪每条评论,这样你就可以找到你遗漏的部分

@api_view(['POST'])
@permission_classes([AllowAny])
def signup_view(request):
    try:
          serializer = UserSerializer(data=request.data)
    # lets remove the condition and let the serializer raise its exception

          serializer.is_valid(raise_exception=True)
    # if this line went through without no exception you should be able to get serializer.validated_data which we will use to get the validated data we need

          data = serializer.validated_data
    # validated_data is an object of the data after its ready to use as mentiond

    # don't forget to import make_password from django.contrib.auth.hashers
          password = make_password(data.get('password'))
    # now follow this way to add data to your desired models for example
          User.objects.create(email=data.get('email'), etc.. 
          seller.objects.create(key=data.get('value'), etc..)
          return Response(serializer.data, status=201)
   # now lets keep in mind the IntegrityError
   # remove the whole create method in you serializer file then try you app
   except IntegrityError:
         return Response('data already exist',status=400)
  • 您可能面临的情况比 itegrityerror 更多,但让我们解决您的问题
  • 强烈建议您查看DRF序列化器它将为您提供所需的能力,甚至了解序列化器的用途,因为归根结底DRF是关于序列化器的
© www.soinside.com 2019 - 2024. All rights reserved.