Я знаю, что здесь есть несколько похожих вопросов, но ни одно из предложенных в них решений пока не помогло мне. Я занимаюсь этим несколько часов, поэтому буду благодарен за любую помощь. Я использую Django rest Framework для создания API. Мои модели, сериализаторы и представления настроены следующим образом:
Моя модель
class Category(models.Model):
name = models.CharField(max_length=40, unique=True)
slug = models.SlugField()
created = models.DateTimeField(auto_now_add=True)
class Post(models.Model):
title = models.CharField(max_length=100, null=False, blank=False)
body= models.TextField(max_length=2000, null=False, blank=False)
owner = models.OneToOneField(User, on_delete=models.CASCADE)
slug = models.SlugField(unique=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
image = models.ImageField(upload_to="profiles", default='profiles/no_image.png', blank=True, null=True)
created = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
class Meta:
ordering = ['-created']
#signal to create slug on save
def pre_save_post_slug(sender, instance, *args, **kwargs):
if not instance.slug:
instance.slug = slugify(instance.title)
# connect signal to model;
pre_save.connect(pre_save_post_slug, sender=Post)
My Serializer.py:
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['id', 'name', 'slug']
extra_kwargs = {
'name': {
'validators': []
}
}
class PostSerializer(serializers.ModelSerializer):
owner = UserSerializer()
image = serializers.ImageField(max_length=None)
category = CategorySerializer(read_only=False)
class Meta:
model = Post
fields = ['id', 'title', 'body', 'owner', 'slug', 'category', 'image', 'created']
def get_image(self, obj):
request = self.context.get('request')
image = obj.image.url
return request.build_absolute_uri(image)
def create(self, validated_data):
title = validated_data.get('title')
body = validated_data.get('body')
slug = slugify(title)
image = validated_data.get('image', None)
category_data = validated_data.pop('category')
cat_id = category_data.get('id')
if cat_id:
category = Category.objects.get(id=cat_id)
post= Post.objects.create(title=title, body=body, category=category, slug=slug, image=image)
return post
My views.py:
class PostCreateAPIView(CreateAPIView):
serializer_class = PostSerializer
queryset = Post.objects.all()
permission_classes = [IsAuthenticated,]
authentication_classes = [TokenAuthentication,]
def create(self, request, *args, **kwargs):
context = {
'request': request
}
serializer = self.get_serializer(data=request.data, context=context)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
response = {'message': 'Post has been created!', 'result': serializer.data}
return Response(response, status=status.HTTP_201_CREATED)
def perform_create(self, serializer):
serializer.save(owner=self.request.user, created=timezone.now())
my urls.py:
path('api/post/create/', PostCreateAPIView.as_view(), name="create-post")
Теперь, когда я отправляю запрос на эту конечную точку, я продолжаю получать эту ошибку:
{errors: [{field: "owner", message: ["This field is required"]},
0: {field: "owner", message: ["This field is required"]}
1: {field: "slug", message: ["This field is required"]}
2: {field: "created", message: ["This field is required"]}
, что означает мой Представления perform_create не запускались, а также строка slug = slugify(title)
в моем сериализаторе.