Django Rest Framework не запускает код в функции perform_create, поэтому выдает ошибки в обязательном поле - PullRequest
0 голосов
/ 20 июня 2020

Я знаю, что здесь есть несколько похожих вопросов, но ни одно из предложенных в них решений пока не помогло мне. Я занимаюсь этим несколько часов, поэтому буду благодарен за любую помощь. Я использую 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) в моем сериализаторе.

1 Ответ

1 голос
/ 20 июня 2020

Попробуйте поместить владельца в read_only_fields в классе сериализатора

...