Не работает метод Post API в Django Rest Framework
Я новичок в DRF и пытаюсь создать четыре основных метода API для моей модели компании. GET, PUT и DELETE работают нормально. Однако у меня возникла проблема с POST. Когда я тестирую его с помощью Postman, он "как бы" сохраняет объект в базе данных, но с нулевыми значениями, а не с теми, которые я ввел. Единственные значения, которые он сохраняет не нулевыми, это ID (который сохраняется автоматически по умолчанию) и поле изображения, потому что я установил изображение по умолчанию. Я использую БД PostgreSQL, и ниже приведены мои models.py, serializers.py, views.py и urls.py.
models.py
`#Companies
#File Location Function
def upload_location(instance, filename, **kwargs):
file_path = 'company/{company_name}-{filename}'.format(
company_name = str(instance.name),
filename = filename
)
return file_path
class Companies(models.Model):
STATUS = (
("Active", "Active"),
("Inactive", "Inactive")
)
#Basic fields
code = models.CharField(max_length=30, unique=True, null=True, verbose_name="Company Code ")
name = models.CharField(max_length=100, unique=True, verbose_name='Company Name ', null=True)
address = models.CharField(max_length=100, unique=True, verbose_name='Address ', blank=True, null=True)
city = models.CharField(max_length=100, verbose_name='City ', blank=True, null=True)
zip_code = models.CharField(max_length=10, verbose_name='Zip Code ', blank=True, null=True)
country = models.CharField(max_length=100, verbose_name='Country ', blank=True, null=True)
default_email = models.CharField(max_length=100, unique=True, verbose_name='Default E-mail ', blank=True, null=True)
default_phone = models.CharField(max_length=100, unique=True, verbose_name='Default Phone Number ', blank=True, null=True)
id_number = models.IntegerField(unique=True, verbose_name='ID Number ', blank=True, null=True)
tax_number = models.IntegerField(unique=True, verbose_name='Tax Number ', blank=True, null=True)
status = models.CharField(max_length=20, null=True, choices=STATUS, verbose_name='Actvity Status ', help_text='Choose from a dropdown list. ', blank=True)
description = RichTextField(blank=True, verbose_name='Company`s Activities ', null=True)
image = models.ImageField(default='default_company_image.jfif', upload_to=upload_location, blank=True, verbose_name='Company Image ', help_text='If not uploaded, the default company-image will be set. Not required field.', null=True)
#Utility field
date_created = models.DateTimeField(auto_now_add=True, verbose_name="Date of Entry in DB")
date_updated = models.DateTimeField(auto_now=True, verbose_name="Date of Entry`s Update in DB")
slug = models.SlugField(blank=True, unique=False, verbose_name="URL Snippet ", help_text="Automatically Created.")
class Meta:
verbose_name = 'Company'
verbose_name_plural = 'Companies'
#Object representation
def __str__(self):
return f'{self.name} in {self.country}'`
serializers.py
`#Companies Serializer
class CompaniesSerializer(serializers.ModelSerializer):
class Meta:
model = Companies
fields = '__all__'`
views.py
`#Create company object in DB through API
@api_view(['POST',])
def create_company(request):
serializer = CompaniesSerializer(data=request.data)
if request.method == "POST":
if serializer.is_valid(raise_exception=True):
company_saved = serializer.save()
return Response({"success": "Company '{}' created successfully".format(company_saved.name)})`
urls.py
`urlpatterns = [
...
path('create_company/', views.create_company, name="create_company"),
...
]`
Вы должны сохранить request.method == "POST" перед сериализатором
@api_view(['POST'])
def create_company(request):
if request.method == "POST":
serializer = CompaniesSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
company_saved = serializer.save()
return Response({"success": "Company '{}' created successfully".format(company_saved.name)})`