Как создать DRF API для возврата всех возможных вариантов полей, доступных вместе со списком пользователей, как dict - PullRequest
0 голосов
/ 18 октября 2019

Я создаю API с использованием DRF и хочу отправить JSONResponse, который будет содержать список всех пользователей (из модели пользователя django) и доступные варианты для нескольких полей в качестве диктанта.

Я пыталсячтобы создать GenericAPIView с набором запросов всех активных пользователей и в сериализаторе я попытался вернуть выбор полей и список пользователей, но результат содержит опции полей вместе с каждым объектом пользователя. Я хочу сохранить все данные пользователей под ключом "user_list" и опциями полей под "field1_choices", "field2_choices".

GenericAPIView:

class TicketPropertiesView(generics.GenericAPIView):
    authentication_classes = [
        CsrfExemptSessionAuthentication,
        BasicAuthentication]
    permission_classes = [IsAuthenticated]
    serializer_class = UserPropertiesSerializer

    def get(self, *args, **kwargs):
        serializer = TicketPropertiesSerializer(data = User.objects.filter(is_active = True),  many = True)
        serializer.is_valid()
        return JsonResponse(serializer.data, safe = False)

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

class UserPropertiesSerializer(serializers.ModelSerializer):
    user_list = serializers.SerializerMethodField()
    field_1_choices = serializers.SerializerMethodField()
    field_2_choices = serializers.SerializerMethodField()

    FIELD_1_MAP = FIELD_1_CHOICES
    FIELD_2_MAP = FIELD_2_CHOICES

    def get_user_list(self, obj):
        queryset = User.objects.filter(is_active = True)
        user = []
        for obj in queryset:
            user.append({
            "id": obj.id,
            "username": obj.username,
            "first_name": obj.first_name
        })
        return user

    def get_field_1_choices(self, *args):
        field1_choices = []
        for i in self.FIELD_1_MAP:
            field1_choices.append({"id": i[0], "choice": i[1]})
        return field1_choices

    def get_field_2_choices(self, *args):
        field2_choices = []
        for i in self.FIELD_2_MAP:
            field2_choices.append({"id": i[0], "choice": i[1]})
        return field2_choices

    class Meta:
        model = User
        fields = ('user_list', 'field_1_choices', 'field_2_choices')

Формат результата:

[{
"user_list": {id:1,...},
"field_1_choices": [{"choice": new}, ...],
"field_2_choices": [{"choice": normal}, ...]
},
{
"user_list": {id:2,...},
"field_1_choices": [{"choice": new}, ...],
"field_2_choices": [{"choice": normal}, ...]
},
]

Вместо ожидаемого вывода должно быть:

{
"user_list": [{"id":1,...}, {"id":2,...}, {"id":3,...}],
"field_1_choices": [{"choice": new}, ...],
"field_2_choices": [{"choice": normal}, ...]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...