Django RestFramework - тестовое представление не работает с результатом 400
прямо сейчас я пытаюсь создать простой тест-файл для ListCreateAPIView внутри моего views.py:
Внутри моего settings.py я установил json по умолчанию для целей тестирования:
REST_FRAMEWORK = {
'TEST_REQUEST_DEFAULT_FORMAT': 'json'
}
views.py:
class AuthorListCreateView(ListCreateAPIView):
queryset = Author.objects.all()
serializer_class = AuthorSerializer
serializers.py:
class AuthorSerializer(serializers.ModelSerializer):
class Meta:
model = Author
fields = '__all__'
urls.py:
urlpatterns = [
path('author/', AuthorListCreateView.as_view(), name='author-list'),
]
models.py
from django.contrib.auth import get_user_model
USER = get_user_model()
class BaseModel(models.Model):
id = models.BigAutoField(primary_key=True, editable=False, unique=True)
created_by = models.ForeignKey(USER, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
get_latest_by = 'created_at'
class Author(BaseModel):
class Gender(models.TextChoices):
NO = 'NO', 'No gender chosen'
DIVERSE = 'DI', 'Diverse'
FEMALE = 'FE', 'Female'
MALE = 'MA', 'Male'
first_name = models.CharField(max_length=50, null=False, blank=False)
last_name = models.CharField(max_length=50, null=False, blank=False)
born = models.DateField(null=False, blank=False)
died = models.DateField(null=True, blank=True)
passed = models.BooleanField(default=False)
gender = models.CharField(max_length=2, choices=Gender.choices, default=Gender.NO)
slug = models.SlugField(null=False, blank=False, unique=True)
class Meta:
ordering = ['last_name', 'first_name']
constraints = [
models.UniqueConstraint(fields=['last_name', 'first_name'], name='unique_name_constraint'),
]
indexes = [
models.Index(fields=['last_name', 'first_name'], name='index_unique_name'),
]
verbose_name = 'Author'
verbose_name_plural = 'Authors'
def __str__(self) -> str:
return f'{self.first_name} {self.last_name}'
def save(self, *args, **kwargs):
self.passed = True if self.died is not None else False
self.slug = slugify(f'{self.last_name}-{self.first_name}') if not self.slug else self.slug
super(Author, self).save(*args, **kwargs)
def get_absolute_url(self):
return reverse('author-detail', kwargs={'slug': self.slug})
def clean(self):
if self.died is not None and self.born > self.died:
raise ValidationError("Date of born can't be further in time than date of death!")
@property
def age(self):
if self.passed:
delta = self.died - self.born
return delta.days // 365
else:
delta = date.today() - self.born
return delta.days // 365
Как вы можете видеть, структура довольно базовая, но всякий раз, когда я пытаюсь протестировать свое представление, я получаю HTTP_400_BAD_REQUEST! В качестве примечания, создание объекта с помощью фактического api работает отлично.
test_views.py:
import datetime
from django.urls import reverse
from django.utils import timezone
from rest_framework import status
from rest_framework.test import APITestCase
from ..models import Author
class AuthorTest(APITestCase):
def test_create_obj(self):
url = reverse('author-list')
data = {
'id': 1,
'first_name': 'Jane',
'last_name': 'Doe',
'born': datetime.date(1940, 1, 1),
'died': datetime.date(2010, 12, 31),
'passed': True,
'gender': 'FE',
'slug': 'doe-jane',
'created_by': 1,
'created_at': timezone.now(),
'updated_at': timezone.now(),
}
response = self.client.post(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertEqual(Author.objects.count(), 1)
self.assertEqual(Author.objects.get().first_name, 'Jane')
Может ли кто-нибудь увидеть, что я упускаю или делаю неправильно?