Локальная переменная DRF 'msg_data', на которую ссылаются до назначения - PullRequest
0 голосов
/ 27 апреля 2020

Это мой serializers.py

class UserProfileSerializer(serializers.ModelSerializer):
img_count = serializers.SerializerMethodField('get_img_count')
post_count = serializers.SerializerMethodField('get_post_count')
msg_count = serializers.SerializerMethodField('get_msg_count')

class Meta:
    model = User
    fields = ('id', 'username', 'img_count', 'post_count', 'msg_count')

def get_img_count(self, obj):
    try:
        img_data = ImgSerializer(Img.objects.filter(author=obj.id), many=True)
    except img_data.DoesNotExist:
        return 0
    return img_data

def get_post_count(self, obj):
    try:
        post_data = PostSerializer(Post.objects.filter(author=obj.id), many=True)
    except post_data.DoesNotExist:
        return 0
    return post_data

def get_msg_count(self, obj):
    try:
        msg_data = Smessage(Msg.objects.filter(author=obj.id), many=True)
    except msg_data.DoesNotExist:
        return 0
    return msg_data

Это мой views.py

class UserProfile(APIView):
permission_classes = [AllowAny]
def get(self, request):
    query = User.objects.all()
    serializer = UserProfileSerializer(query, many=True)
    return Response(serializer.data)

Это фрагмент кода

Я хочу получить это

{"id": 9, "username": "emil@gmail.com", "img_count: 3," post_count ": 5," msg_count ": 50,}

также получаю ошибку после использования img_count.count ().

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

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

class UserProfileSerializer(serializers.ModelSerializer):
    img_count = serializers.SerializerMethodField('get_img_count')
    post_count = serializers.SerializerMethodField('get_post_count')
    msg_count = serializers.SerializerMethodField('get_msg_count')

    class Meta:
        model = User
        fields = ('id', 'username', 'img_count', 'post_count', 'msg_count')

    def get_img_count(self, obj):
        img_data = 0
        try:
            img_data = ImgSerializer(Img.objects.filter(author=obj.id), many=True).data
        except Img.DoesNotExist:
            pass
        return img_data

    def get_post_count(self, obj):
        post_data = 0
        try:
            post_data = PostSerializer(Post.objects.filter(author=obj.id), many=True).data
        except Post.DoesNotExist:
            pass
        return post_data

    def get_msg_count(self, obj):
        msg_data = 0
        try:
            msg_data = Smessage(Msg.objects.filter(author=obj.id), many=True).data
        except Msg.DoesNotExist:
            pass
        return msg_data
0 голосов
/ 27 апреля 2020

Вы должны изменить исключения на:

img_data.DoesNotExist --> Img.DoesNotExist
post_data.DoesNotExist --> Post.DoesNotExist
msg_data.DoesNotExist --> Msg.DoesNotExist

Поскольку экземпляры не имеют никаких объектов исключений, скорее, классы моделей имеют их. Более подробную информацию можно найти в documentation.

Обновление

Если вы просто хотите считать, то вам не нужно использовать такая обширная реализация. Вы можете просто попробовать:

def get_img_count(self, obj):
    return Img.objects.filter(author=obj.id).count()

def get_post_count(self, obj):
    return Post.objects.filter(author=obj.id).count()

def get_msg_count(self, obj):
    return Msg.objects.filter(author=obj.id).count()
...