Ошибка целостности - ограничение UNIQUE не сработало. Как мне с этим справиться? Django
Я новичок во фреймворке DRF и создаю небольшой проект. Я хочу создать экземпляр User (встроенный экземпляр) и при этом сделать экземпляр Seller, связанный с ним во время регистрации пользователя.
Когда я пытаюсь это сделать, Django выбрасывает ошибку целостности : UNIQUE constraint failed: seller_seller.user_id.
Можете ли вы все помочь мне разобраться в этой проблеме и исправить ее?
Пожалуйста, спрашивайте, если требуется дополнительная информация.
models.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}"
serializers.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)
Я пробовал создавать для них отдельные представления, но безрезультатно.
Здесь много недопонимания по поводу вашего метода create
в сериализаторе:
create
отвечает за то, как (какие) данные будут храниться в модели .
- техника сохранения пароля на самом деле сохраняет пароль в виде обычного текста; если вы зашли в модель пользователя в админке django, то скорее всего найдете password:unknown hashing algorithm .
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)
- есть и другие случаи
IntegrityError
, с которыми вы можете столкнуться, но давайте разберемся с вашей проблемой .
- настоятельно рекомендуем посмотреть на сериализаторы в DRF; это даст вам силу, необходимую для понимания назначения сериализатора, потому что в конце концов DRF - это сериализаторы .