Я пытаюсь создать API пользователя поставщика, который имеет отношения один-к-одному с пользователем, он бросает ошибку целостности, пожалуйста, помогите мне
Ошибка целостности в проекте фреймворка Django rest.
Я пытаюсь зарегистрировать пользователя поставщика, который имеет отношения один к одному с пользователем, но это приводит к ошибке целостности.
- Код ошибки
IntegrityError at /API/accounts/signup/vendor/
Сбой ограничения NOT NULL: accounts_vendor.user_id
Метод запроса: POST
URL запроса: ``http://127.0.0.1:8000/api/accounts/signup/vendor/
Версия Django: 4.2.6
Тип исключения: IntegrityError
Значение исключения:
NOT NULL constraint failed: accounts_vendor.user_id
Местоположение исключения: C:\Users\Moses Ogiri\Desktop\medic-ecommerce\env\Lib\site-packages\django\db\backends\sqlite3\base.py, строка 328, in execute
Вызвано во время: accounts.views.VendorSignupView
Исполняемый файл Python: C:\Users\Moses Ogiri\Desktop\medic-ecommerce\env\Scripts\python.exe
Версия Python: 3.12.0
- model.py
class User(AbstractBaseUser, PermissionsMixin):
ADMIN = 1
VENDOR = 2
HEALTHCARE = 3
LOGISTIC = 4
CUSTOMER = 5
ROLE_CHOICES = (
(ADMIN, 'Admin'),
(VENDOR, 'Vendor'),
(HEALTHCARE, 'Healthcare'),
(LOGISTIC, 'Logistic'),
(CUSTOMER, 'Customer'),
)
id = models.UUIDField(primary_key=True, default=uuid.uuid4,editable=False, unique=True)
first_name = models.CharField(max_length=100, validators=[MinLengthValidator(2)], null=False)
last_name = models.CharField(max_length=100, validators=[MinLengthValidator(2)], null=False)
email = models.EmailField(_('email address'), max_length=100, unique=True)
role = models.PositiveSmallIntegerField(choices=ROLE_CHOICES, blank=True, null=True)
is_staff = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_verified = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at= models.DateTimeField(auto_now=True)
auth_provider = models.CharField(max_length=255, blank=False, null=False, default=AUTH_PROVIDERS.get('email'))
objects = UserManager()
REQUIRED_FIELDS = ["first_name", "last_name"]
USERNAME_FIELD = 'email'
ordering = ('-created_at ',)
def __str__(self):
return self.email
@property
def get_full_name(self):
return f"{self.first_name.title()} {self.last_name.title()}"
serializer.py
class VendorSerializer(serializers.ModelSerializer): id = serializers.UUIDField(read_only=True)
class Meta:
model = Vendor
fields = [
'id', 'company_name', 'company_logo',
'company_files', 'company_email', 'phone_number',
'company_reg_no', 'description'
]
def save(self, **kwargs):
user = super().save(**kwargs)
user = self.context['user']
user.role = User.VENDOR
if self. the instance is None:
self.instance = self.update(self.instance, self.validated_data)
return self. instance
vendor = Vendor.objects.create(**self.validated_data, user=user)
return vendor
- views.py
class VendorSignupView(generics.GenericAPIView):
def get_serializer_class(self):
return VendorSerializer
def get_queryset(self):
return Vendor.objects.filter(user=self.request.user.id )
def get_serializer_context(self):
return {
'user': self.request.user.id
}
def post(self, request):
serializer=self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user=serializer.save()
return Response({
"user": UserSerializer(user, context=self.get_serializer()).data,
"tokens": user.tokens(),
"message": "Account created successfully"
})
class VendorupdateView(generics.GenericAPIView,
mixins.UpdateModelMixin,
mixins.RetrieveModelMixin
):
def get_serializer_class(self):
return VendorSerializer
def update(self, request, *args, **kwargs): instance = self.get_object() print(instance) serializer =self.get_serializer_class(instance=request.data) serializer.is_valid(raise_exception=True) self.perform_update(serializer)`ваш текст` return Response(serializer.data)