Почему данные в сериализаторе не отображаются в django?

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

Я собираюсь создать четыре сериализатора и поместить три сериализатора в один сериализатор. Однако только один из трех сериализаторов работает нормально, а два других — нет. Я сделал структуру трех сериализаторов почти идентичной, но я не понимаю, работает ли только один. Пожалуйста, помогите мне решить проблему.

JSON

     {
        "pk": 1,
        "author": {
            "username": "username",
            "email": "email",
            "profile": "image_link"
        }, # AuthorSerializer is worked
        "title": "title1",
        "text": "text1",
        "view": 0,
        # ImageSerializer is not worked
        "like_count": 0,
        # LikerSerializer is not worked
        "comment_count": 0,
        "tag": "hash tag",
        "created_at": "time"
    }
  

serializers.py

 class AuthorSerializer (serializers.ModelSerializer) :
    profile = serializers.ImageField(use_url=True)

    class Meta :
        model = User
        fields = ('username', 'email', 'profile')

class ImageSerializer (serializers.ModelSerializer) :
    image = serializers.ImageField(use_url=True)

    class Meta :
        model = Image
        fields = ('image', )

class LikerSerializer (serializers.ModelSerializer) :
    id = serializers.IntegerField(source='liker.pk')

    class Meta :
        model = Like
        fields = ('id', )

class PostSerializer (serializers.ModelSerializer) :
    author = AuthorSerializer(read_only=True)
    image = ImageSerializer(read_only=True, many=True)
    like_count = serializers.ReadOnlyField()
    liker = LikerSerializer(read_only=True, many=True)
    comment_count = serializers.ReadOnlyField()

    class Meta :
        model = Post
        fields = ('pk', 'author', 'title', 'text', 'image', 'view', 'like_count', 'liker',  'comment_count', 'tag', 'created_at')
 
    def create (self, validated_data) :
        images_data = self.context['request'].FILES
        post = Post.objects.create(**validated_data)

        for image_data in images_data.getlist('image') :
            Image.objects.create(post=post, image=image_data)

        return post

    def validate (self, attrs) :
        title = attrs.get('title', '')
        text = attrs.get('text', '')

        error = {}

        if title is None and text is None :
            error['message'] = '제목과 본문은 빈칸일 수 없습니다.'
            serializers.ValidationError(error)

        if title is None :
            error['message'] = '제목은 빈칸일 수 없습니다.'
            serializer.ValidationError(error)

        if text is None :
            error['message'] = '본문은 빈칸일 수 없습니다.'    
            serializer.ValidationError(error)

        return attrs
  

models.py

 class Post (models.Model) :
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='author', null=True)
    title = models.CharField(max_length=40, null=True)
    text = models.TextField(max_length=300, null=True)
    tag = models.CharField(max_length=511, null=True)
    view = models.IntegerField(default=0)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__ (self) :
        return self.title

    @property
    def comment_count (self) :
        return Comment.objects.filter(post=self.pk).count()

    @property
    def like_count (self) :
        return Like.objects.filter(post=self.pk).count()
 
class Image (models.Model) :
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    image = models.ImageField(null=True, blank=True)

class Comment (models.Model) :
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    text = models.TextField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)

class Like (models.Model) :
    liker = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)
  

Комментарии:

1. Изображение и Лайкер one to many связаны?

2. Можете ли вы показать свои модели?

3. Если вы создадите свои вспомогательные сериализаторы, поскольку read_only они не будут проверены PostSerializer при отправке Post-запроса. Удалите read_only параметры из вспомогательных сериализаторов.

4. @Charnel Я добавляю это!

5. @adnankaya Если я удалю read_only, это приведет к ошибке «Got AttributeError при попытке получить значение для поля image в сериализаторе PostSerializer . Поле сериализатора может быть названо неправильно и не соответствовать какому-либо атрибуту или ключу Post экземпляра. »