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, но просто интересно, есть ли способ обойти это? Должен ли я затем создать копию и поместить ее над кодом, который ссылается на нее?