Как я могу использовать вложенный сериализатор внутри того же сериализатора?

class UserViewSerializer(DynamicFieldsMixin,serializers.ModelSerializer):
    followers_set = UserViewSerializer(required=False,many=True)

    class Meta:
        model = User
        fields  = ('id','email','username','password','followers_set')
        depth = 2

В любом случае я могу использовать эту функцию, не получая эту ошибку?

    followers_set = UserViewSerializer(source='follows',required=False,many=True)
NameError: name 'UserViewSerializer' is not defined

Я попробовал SerializerMethodField, но тогда я не могу использовать там опцию глубины

following_set = serializers.SerializerMethodField()

    def get_following_set(self, user):
        return UserViewSerializer(User.objects.filter(follows__author=user), many=True).data

Использование SerializerMethodField дает мне ошибку:

RecursionError at /api/users/
maximum recursion depth exceeded

Может кто-нибудь помочь мне, пожалуйста?

Вместо этого создайте дополнительный сериализатор для подписчиков, возможно, вам все равно не нужны подписчики подписчиков.

iklinac 20.12.2020 15:55

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

umarbeyoglu 20.12.2020 15:56

@umarbeyoglu: если вы сделаете два дополнительных сериализатора, один без followers_set и один с depth = 1, то у вас просто будет «трехэтапный» сериализатор.

Willem Van Onsem 20.12.2020 15:57

У вас все еще могут быть правильные конечные точки API, которые будут проверять, является ли это последователем последователя, вместо того, чтобы сбрасывать большой JSON, который приведет к икоте загрузки.

iklinac 20.12.2020 16:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
4
253
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Самый простой способ справиться с этим — создать три сериализатора: один без followers_set, один с followers_set, который использует предыдущую модель, и один, который использует вторую модель, поэтому:

# no followers_set
class UserViewSerializer0(DynamicFieldsMixin,serializers.ModelSerializer):

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

# followers_set, but only depth 1
class UserViewSerializer1(DynamicFieldsMixin,serializers.ModelSerializer):
    followers_set = UserViewSerializer0(source='follows',required=False,many=True)

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

# followers_set, with depth 2
class UserViewSerializer(DynamicFieldsMixin,serializers.ModelSerializer):
    followers_set = UserViewSerializer1(source='follows',required=False,many=True)

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

Это также более безопасно, так как вы не можете определять рекурсивные циклы, если вы действительно не работаете с SerializerMethodField, что не очень хорошая идея, если вы добавляете дополнительные сериализаторы.

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

Другие вопросы по теме