Ошибочный запрос при сериализации данных
Я создаю конечные точки API для приложения электронной коммерции B2B. У меня есть модель компании для хранения данных о компаниях, которые создают аккаунт. Я связал модель компании с моделью пользователя по умолчанию в django, так что учетная запись пользователя будет создана вместе с объектом компании. Я связал модель компании и модель пользователя (отношения "один к одному"). Я продолжаю получать эту ошибку, "Bad Request: /accounts/create/", когда я отправляю данные через просматриваемый API.
Это моя модель.
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Company(models.Model):
class IndustryType(models.TextChoices):
MANUFACTURING = "MAN", "Manufacturing"
CONSTRUCTION = "CON", "Construction"
IT = "IT", "Information Technology"
PROFESSIONAL_SERVICES = "PS", "Professional Services"
HEALTHCARE = "HC", "Healthcare"
FINANCIAL_SERVICES = "FS", "Financial Services"
WHOLESALE_AND_DISTRIBUTION = "WD", "Wholesale and Distribution"
RETAIL = "RET", "Retail"
EDUCATION = "EDU", "Education"
user = models.OneToOneField(User, on_delete=models.CASCADE)
company_name = models.CharField(max_length=255)
industry_type = models.CharField(max_length=255, choices=IndustryType.choices)
tax_identification_number = models.CharField(max_length=15)
address = models.CharField(max_length=255)
phone = models.CharField(max_length=50)
email = models.EmailField()
def __str__(self):
return self.company_name
Это мой сериализатор
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Company
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company
fields = (
"company_name",
"industry_type",
"tax_identification_number",
"address",
"phone",
"email",
)
class SignUpSerializer(serializers.ModelSerializer):
password1 = serializers.CharField(style={"input_type": "password"}, write_only=True)
password2 = serializers.CharField(style={"input_type": "password"}, write_only=True)
company = CompanySerializer()
class Meta:
model = User
fields = (
"username",
"password1",
"password2",
"company"
)
def create(self, validated_data):
try:
user = User.objects.create(username=validated_data["username"])
user.set_password(validated_data["password1"])
user.save()
company_data = validated_data.pop('company')
company_data['user'] = user
company_serializer = CompanySerializer(data=company_data)
if company_serializer.is_valid():
company = company_serializer.save(user=user)
else:
raise serializers.ValidationError(company_serializer.errors)
except IntegrityError:
raise serializers.ValidationError(
company_serializer.errors
)
return user
Это мое мнение
from rest_framework import generics, permissions, authentication
from rest_framework.response import Response
from .serializer import SignUpSerializer
class SignUpView(generics.CreateAPIView):
serializer_class = SignUpSerializer
permission_classes = [permissions.AllowAny]
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, headers=headers)
Интерфейс представления данных Неправильный запрос
Когда я проверяю базу данных. Объект пользователя сохранен успешно, но объект компании не сохранен.
Пожалуйста, что я делаю неправильно.
Я проверил, что company_serializer.is_valid() возвращает 'True', распечатав его. Я также распечатал company_serializer, и результат показан ниже. Если сериализатор компании содержит данные, почему данные не сохраняются в режиме компании.
CompanySerializer(data=OrderedDict([('company_name', 'Peers In Tech'), ('industry_type', 'WD'), ('tax_identification_number', '01210884B'), ('address', 'afdfads'), ('phone', '0547145189'), ('email', 'abdulbasitm810@gmail.com'), ('user', <User: stackuser>)])):
company_name = CharField(max_length=255)
industry_type = ChoiceField(choices=[('MAN', 'Manufacturing'), ('CON', 'Construction'), ('IT', 'Information Technology'), ('PS', 'Professional Services'), ('HC', 'Healthcare'), ('FS', 'Financial Services'), ('WD', 'Wholesale and Distribution'), ('RET', 'Retail'), ('EDU', 'Education')])
tax_identification_number = CharField(max_length=15)
address = CharField(max_length=255)
phone = CharField(max_length=50)
email = EmailField(max_length=254)