#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
экземпляра. »