我是 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)
我尝试为他们制作单独的视图,但没有成功。
对序列化器中的创建方法有很多误解
所以让我们修复一些行,但请记住,在我给你提供了继续前进的要点之后,你可能会遇到一些错误, 跟踪每条评论,这样你就可以找到你遗漏的部分
@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)