Как вложить поля модели под другой ключ для сериализатора
У меня есть такой тип модели Post
class Post(models.model):
id = models.UUIDField(primary_key=True, default=uuid4)
user = models.ForeignKey(UserProfile, null=True, on_delete=models.CASCADE)
tags = models.ManyToManyField("Tags", blank=True, related_name="posts")
title = models.CharField(max_length=200)
body = RichTextField(blank=True, null=True)
post_views = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True, verbose_name=("created_at"))
in the serializer, I want to nest title, body, created_at under another key named article
serializers.py
class ArticleSerializer(serializers.ModelSerializer):
title = serializers.CharField()
content = serializers.CharField(source="body")
created_at = serializers.CharField()
class Meta:
model = Post
fields = ("title", "body", "created_at")
class PostSerializer(serializers.ModelSerializer):
user = serializers.SlugRelatedField(slug_field="email", read_only=True)
article = ArticleSerializer(required=True)
tags = TagSerializer(many=True, required=False)
post_views = serializers.IntegerField(read_only=True)
def to_representation(self, instance):
data = super().to_representation(instance)
cat = data.pop("category")
title = data.pop("title")
content = data.pop("body")
created_at = data.pop("created_at")
data["categories"] = cat
data["article"] = {"title": title, "content": content, "created_at": created_at}
return data
class Meta:
model = Post
fields = "__all__"
views.py
class ArticleView(APIView):
def get_object(self, pk: int):
try:
if pk:
return Post.objects.filter(pk=pk, draft=False)
return Post.objects.filter(draft=False)
except Post.DoesNotExist:
raise Http404
def get(self, request: Request, pk=None):
post = self.get_object(pk)
serializer = PostSerializer(post, many=True)
return Response(serializer.data)
Ошибка, которую я получаю
AttributeError: Got AttributeError when attempting to get a value for field `article` on
serializer `PostSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the
`Post` instance.
Original exception text was: 'Post' object has no attribute 'article'
fields = ["article","modelfield", etc etc]
в постсериализаторе вместо всех вызывать поля