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
Может кто-нибудь помочь мне, пожалуйста?
Я должен. Я создаю систему социальных сетей. Вот почему я хочу использовать глубину, чтобы ограничить ее использование.
@umarbeyoglu: если вы сделаете два дополнительных сериализатора, один без followers_set и один с depth = 1, то у вас просто будет «трехэтапный» сериализатор.
У вас все еще могут быть правильные конечные точки API, которые будут проверять, является ли это последователем последователя, вместо того, чтобы сбрасывать большой JSON, который приведет к икоте загрузки.
Самый простой способ справиться с этим — создать три сериализатора: один без 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, что не очень хорошая идея, если вы добавляете дополнительные сериализаторы.
Однако может быть лучше не идти на глубину два, а придерживаться глубины один. Это уже будет генерировать большие ответы, сделает создание объектов более громоздким и приведет к большому количеству дополнительных запросов.
Вместо этого создайте дополнительный сериализатор для подписчиков, возможно, вам все равно не нужны подписчики подписчиков.