Переопределить данные JSON в Django RestFramwork - PullRequest
0 голосов
/ 04 октября 2018

Прямо сейчас с текущими функциями просмотра. Я получаю данные, приведенные ниже:

{"item": "zxmnb",
"category": "zxc",
"price": "zxc",
"restaurant": 1}

Вот мой файл просмотров:

class RestaurantMenuView(generics.RetrieveAPIView):
    lookup_field = 'item'
    serializer_class = MenuSerializer

    def get_queryset(self):
        return Menu.objects.all()

Но проблема в том, что мне нужны данныебыть в формате как:

{"restaurant": "name"
"item":"some item",
"category": "some category",
"price": "some price"
}

Я хочу отметить, что Ресторан - еще одна модель в моем классе моделей. Теперь я знаю, что если я использую ресторан, я получу только ПК.Но я хочу, чтобы JSON отображался таким образом.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Почему бы вам не переопределить функцию to_representation ().Примерно так:

class MenuSerializer(serializers.ModelSerializer):
    def to_representation(self, obj):
        restaurants = RestaurantSerializer(instance=obj, 
        context=self.context).data
        data = []
        for restaurant in restaurants:
            data.append(
                {
                    "restaurant": {
                        "item": obj.item,
                        "category": obj.category,
                        "price": obj.price,
                        "name": restaurant.name,
                    }
                }
            )
        return data

Не глядя на ваши модели или почему вы хотите ресторан там, я добавил цикл for, чтобы показать вам, что вы можете в значительной степени получить доступ к любым данным в вашем to_representation () и поместите его в любой формат, который вы хотите.Я использую это, когда пытаюсь визуализировать мои объекты JSON в XML особым образом.Надеюсь это поможет.

Также ознакомьтесь с документацией: https://www.django -rest-framework.org / api-guide / serializers / # overriding-serialization-and-deserialization-поведения

Другое решение, которое вы могли бы рассмотреть, это добавить внешний ключ вашей модели меню обратно в ресторан, тогда вы можете определить свой сериализатор следующим образом:

class RestaurantSerializer(serializers.ModelSerializer):
    menu = MenuViewSerializer(read_only=True, many=True)

    class Meta:
        model = Restaurant
        fields = [
            "id",
            "name",
            "menu",
        ]
        extra_kwargs = {
            "menu": {"read_only": True},
        }
0 голосов
/ 04 октября 2018

Вам необходимо изменить MenuSerializer.В частности, вам нужно изменить поле restaurant на CharField, а также предоставить атрибут source.Примерно так:

class MenuSerializer(serializers.ModelSerializer):
    restaurant = serializers.CharField(source='restaurant.name')
    # ... other stuff in the serializer

Здесь я предполагаю, что ваша модель Restaurant имеет поле name.

Подробнее о полях Serializer можно прочитать здесь: https://www.django -rest-framework.org / апи-гид / поля /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...