Django Rest Framework - Как я могу получить неограниченную глубину определенного поля в сериализаторе

У меня есть сообщения и ответы на сообщения. У ответов могут быть родители, если только ответ не является верхним ответом. Как в twitter, вы можете ответить на ответ, и если вы нажмете на ответ, вы увидите ответ и родителей ответа, поэтому существует иерархия ответов.

У меня два вопроса, пожалуйста.

ОДИН:

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

Я не хочу, чтобы установка глубины была больше 1, поэтому ищу альтернативный способ или, возможно, лучший или правильный способ.

Вот мой сериализатор сообщений:

class PostSerializer(serializers.ModelSerializer):
    images = PostImageSerializer(many=True, read_only=True, required=False)
    profile = serializers.SerializerMethodField()
    replies = PostRepliesSerializer(many=True, read_only=True, required=False)

    class Meta:
        model = Post
        fields = [
            "id",
            "can_view",
            "can_comment",
            "category",
            "body",
            "images",
            "video",
            "profile",
            "published",
            "created_at",
            "updated_at",
            "replies",

        ]
        depth = 1

    def get_profile(self, obj):
        profile_obj = Profile.objects.get(id=obj.user.profile.id)
        profile = ShortProfileSerializer(profile_obj)
        return profile.data
 
    def create(self, validated_data):
        user = User.objects.get(id=self.context['request'].data.get('user'))
        category = Category.objects.get(id=self.context['request'].data.get('category'))
        new_post = Post.objects.create(**validated_data, category=category, user=user)
        images = dict((self.context['request'].FILES).lists()).get('images', None)
        if images:
            for image in images:
                PostImage.objects.create(
                    image=image, post=new_post
                )
        return new_post

и вот мой сериализатор ответов:

class ReplySerializer(serializers.ModelSerializer):
    images = ReplyImageSerializer(many=True, read_only=True, required=False)
    replies = ReplyProfileSerializer(many=True, read_only=True, required=False)
    post = serializers.SerializerMethodField()
    profile = serializers.SerializerMethodField()
    post_images = serializers.SerializerMethodField()

    class Meta:
        model = Reply
        fields = [
            "id",
            "body",
            "parent",
            "video",
            "replies",
            "created_at",
            "updated_at",
            "images",
            "post",
            "post_images",
            "profile",
            
        ]
        depth = 1

    def get_post(self, obj):
        post_obj = Post.objects.get(id=obj.post.id)
        post = ShortPostSerializer(post_obj)
        return post.data

    def get_profile(self, obj):
        profile_obj = Profile.objects.get(id=obj.user.profile.id)
        profile = ShortProfileSerializer(profile_obj)
        return profile.data

    def get_post_images(self, obj):
        images = PostImage.objects.filter(post=obj.post.id)
        serializer = PostImageSerializer(images, many=True)
        return serializer.data     
    
    def create(self, validated_data):
        new_reply = Reply.objects.create(**validated_data)
        images = dict((self.context['request'].FILES).lists()).get('images', None)
        if images:
            for image in images:
                ReplyImage.objects.create(
                    image=image, reply=new_reply
                )
        return new_reply

2:

Мой второй вопрос, возможно, немного не связан с Python и просто является тем, что меня беспокоит. Если я объявляю в файле сериализатор (назовем его ONE) и хочу изменить поле в другом сериализаторе (TWO), то я не могу использовать сериализатор ONE, если его код находится ниже TWO, однако я могу ссылаться на ONE в методе сериализатора TWO, и это разрешено. Почему я не могу ссылаться или использовать сериализатор, который находится дальше по странице? Я знаю, что так работает Python, но просто интересно, есть ли способ обойти это? Должен ли я затем создать копию и поместить ее над кодом, который ссылается на нее?

Вернуться на верх