Django 如何在同一序列化程序中使用嵌套序列化程序?

Django 如何在同一序列化程序中使用嵌套序列化程序?,django,django-rest-framework,Django,Django Rest Framework,我是否可以使用此函数而不出现此错误 class UserViewSerializer(DynamicFieldsMixin,serializers.ModelSerializer): followers_set = UserViewSerializer(required=False,many=True) class Meta: model = User fields = ('id','email','username','password','

我是否可以使用此函数而不出现此错误

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
我尝试序列化MethodField,但无法在那里使用深度选项

    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

有人能帮我吗?

处理这个问题的最简单方法是制作三个序列化程序:一个没有
followers\u集
,一个有
followers\u集
,使用前一个,另一个使用第二个模型,因此:

RecursionError at /api/users/
maximum recursion depth exceeded
#未设置跟随者
类UserViewSerializer0(DynamicFieldsMixin,serializers.ModelSerializer):
类元:
模型=用户
字段=('id'、'email'、'username')
#followers\u集,但仅深度1
类UserViewSerializer1(DynamicFieldsMixin,serializers.ModelSerializer):
followers\u set=UserViewSerializer0(source='followers',required=False,many=True)
类元:
模型=用户
字段=('id'、'email'、'username')
#随动装置,深度为2
类UserViewSerializer(DynamicFieldsMixin,serializers.ModelSerializer):
followers\u set=UserViewSerializer1(source='followers',required=False,many=True)
类元:
模型=用户
字段=('id'、'email'、'username')
这也更安全,因为您不能定义递归循环,除非您确实使用
SerializerMethodField
,如果您添加额外的序列化程序,这不是一个好主意


不过,最好不要进入深度2,而是坚持深度1。它已经会生成大量响应,使创建对象变得更加麻烦,并会导致大量额外的查询。

为关注者创建额外的序列化程序。相反,你可能不想让关注者的关注者成为关注者。我正在创建一个社交媒体系统。这就是为什么我想用深度来限制它的使用。@umarbeyoglu:如果你做了两个额外的序列化程序,一个没有
followers\u set
,另一个有
depth=1
,那么你就有了一个“三阶段”序列化程序。您仍然可以使用适当的API端点来检查它是否是跟随者的跟随者,而不是转储会导致加载打嗝的大JSON
# 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')