Проблема со списком сериализации в Django framework и Vue JS - PullRequest
0 голосов
/ 17 января 2020

Я хочу сериализовать список во время обновления, например, вызов патча для обновления ниже профиля пользователя с помощью «кухни»

Получить вызов

**http://localhost:8000/api/v1/chef/rayees/details**


    {
        "user": {
            "pk": 2,
            "username": "rayees",
            "email": "rayees.xxxx@yahoo.co.in",
            "first_name": "Rayees",
            "last_name": "xxxx",
            "user_type": "Chef"
        },
        "first_name": "Rayees",
        "last_name": "xxx",
        "bio": "TEST BIO",
        "chef_cost": "10.00",
        "serve_type": "Non-Veg",
        "cuisine": [
            "South Indian", 
            "North Indian"
        ]

    }

Вот мой класс сериализатора, я Подумайте, что "serializers.SerializerMethodField ()" только для чтения, а "кухня" не обновляется во время операции исправления. Если вы хотите сериализовать get и patch, что мне делать здесь

class ChefProfileDetails(serializers.ModelSerializer):
    chef_date = AvailabilityDetails(many=True, read_only=True)
    first_name = serializers.CharField(source='user.first_name', read_only=True)
    last_name = serializers.CharField(source='user.last_name', read_only=True)
    cities = CitySerializer(many=True, read_only=True)
    cuisine = serializers.SerializerMethodField()
    user = UserDetailsSerializer(read_only=True)

    class Meta:
        model = Chef
        fields = ('user', 'first_name', 'last_name', 
                  'bio', 'chef_cost', 'serve_type', 'cuisine', 'chef_date', 'cities')

    def get_cuisine(self, obj):
        cuisine_list = []
        for i in obj.cuisine.all():
            cuisine_list.append(i.cuisine)
        return cuisine_list

Ответы [ 2 ]

1 голос
/ 17 января 2020

Существует связь «один ко многим» между моделями Chef и Cuisine, поэтому попробуйте использовать RelatedField:

class ChefProfileDetails(serializers.ModelSerializer):
    cuisines = serializers.RelatedField(many=True)

    class Meta:
        model = Chef
        fields = ('user', 'first_name', 'last_name', 
                  'bio', 'chef_cost', 'serve_type',
                  'cuisine', 'chef_date', 'cities')

Я думаю, это должно работать.

0 голосов
/ 17 января 2020

Вы можете достичь того, что вам нужно, определив пользовательское поле, а затем предоставив определение геттера и сеттера в to_representation() и to_internal_value() соответственно.

Код:

class CuisineField(serializers.Field):
    def to_representation(self, value):
        cuisine_list = []
        for i in value:
            cuisine_list.append(i.cuisine)
        return cuisine_list


    def to_internal_value(self, data):
        ""
         Do whatever you want to do in patch
        ""

А затем определите кухню как CuisineField в вашем сериализаторе как

cuisine = CuisineField()

См. DRF docs для пользовательских полей

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