Django остальные рамки добавляют больше данных при сериализации многих объектов - PullRequest
0 голосов
/ 19 ноября 2018

Я хотел бы добавить дополнительное поле для данных пользователя.Но он должен использовать другое значение вне полей базы данных.Для более ясно, как это

модель:

class User(models.Model):
    id= models.AutoField(primary_key=True)
    last_name= models.CharField(max_length=20)
    first_name=models.CharField(max_length=20)
    role_id = models.IntegerField()

сериализатор:

class UserSerializer(serializers.ModelSerializer):
    display_summary = serializers.SerializerMethodField()
    login_user_id = serializers.IntegerField(required=False)

    class Meta:
        model = User
        fields = ("id","last_name","first_name", "display_summary", "login_user_id")

    def get_display_summary(self, obj):
        login_id    = self.validated_data.get('login_user_id', None)
        login_user  = User.objects.filter(pk=login_id).first()
        if obj.role_id==2 and login_user.role_id==1:
            return 1

        return 0

Так что, на мой взгляд,при получении только одного пользователя все в порядке:

@api_view(['GET'])
@login_required
def get_user(request, login_user, user_id):
    serializer = UserSerializer(User.objects.get(pk=user_id), data={'login_user_id': login_user.id})
    if serializer.is_valid():
        result = serializer.data
        return Response(result, status=status.HTTP_200_OK)

#result:
#{
#    "id": 2,
#    "last_name": "V",
#    "first_name": "Lich",
#    "role_id": 2,
#    "display_summary": 1
#}

Но когда мне нужно вернуть список, как я могу добавить дополнительные данные (login_user_id)?Это не работает:

users = User.objects.filter(last_name__icontains='v')
result_serializer = UserSerializer(users, data={'login_user_id': login_user.id}, many=True)
return result_serializer.data

Произошла ошибка, скажем, что он ищет список, а не диктат для введенного параметра.

1 Ответ

0 голосов
/ 05 декабря 2018

Основываясь на идее @Hai Lang, я создал новый именованный кортеж, чтобы добавить больше информации.Примерно так:

Сериализатор: Не использовать ModelSerializer, используйте обычный Сериализатор с полем. Я хотел бы показать на этом виде

class UserSummarySerializer(serializers.Serializer):
    user_id = serializers.SerializerMethodField()
    last_name = serializers.SerializerMethodField()
    first_name = serializers.SerializerMethodField()
    display_summary = serializers.SerializerMethodField()

    def validate(self, data):
        #some validation if needed
        return data
    def get_user_id(self, obj):
        return obj.user.user_id
    def get_last_name(self, obj):
        return obj.user.last_name
    def get_first_name(self, obj):
        return obj.user.first_name
    def get_display_summary(self, obj):
        login_user  = obj.login_user
        if obj.role_id==2 and login_user.role_id==1:
            return 1

        return 0

, тогда в моих представлениях:

userSummary = namedtuple('userSummary ', ('user', 'login_user'))
users = User.objects.filter(last_name__icontains='v')
objs  = [userSummary(u, login_user) for u in users]
result_serializer = UserSerializer(objs, many=True)
return result_serializer.data
...