Ошибка целостности - ограничение 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 - это сериализаторы
  • .
Вернуться на верх