Как получить и обработать Ввод для django-multiselectfield в структуре отдыха Django через form-data

Я имею User модель с food_prefrence поле, для которого пользователь имеет возможность выбрать несколько вариантов.

В моделях я использую MultiSelectField из https://github.com/goinnn/django-multiselectfield, чтобы решить мою проблему. и в моем сериализаторе пользователя я использую fields.MultipleChoiceField, предоставляемый rest-framework.

Теперь моя проблема заключается в том, как получить ввод от пользователя с использованием данных формы и как его обработать в моем представлении или сериализаторе. На данный момент, когда я пытаюсь вставить выбор, используя почтальон с выбранными данными формы, это вызывает ошибку когда serializer.is_valid() называется

{
    "food_preference": [
        "\"'Indian', 'Continental'\" is not a valid choice."
    ]
}

ниже мой фрагмент кода.

#models.py
class User(AbstractUser, BaseClass):
    food_preference = MultiSelectField(_('Food Preference'), choices=CONST_Food, blank=True, null=True)

#serializer.py
class UserSerializer(serializers.HyperlinkedModelSerializer):
    food_preference = fields.MultipleChoiceField(choices=CONST_Food, required=False)

def update(self, instance, validated_data):
    instance.food_preference = validated_data.get('food_preference', instance.food_preference)
    instance.save()
    return instance, "Updated Successfully"

#views.py
def update(self, request, *args, **kwargs):
    instance = self.get_object()
    serializer = self.serializer_class(data=request.data, context={"request": self.request})
    print(serializer.initial_data)
    if serializer.is_valid(raise_exception=True): ##<<<<<Execution stops here
        print("is valid")
        result = serializer.update(instance=instance, validated_data=request.data)
        if result[0] is None:
            return _error_response(400, EPHISH, result[1], {})
        data = self.serializer_class(result[0], context={"request": self.request}).data
        return _response(data, status.HTTP_201_CREATED)
    else:
        return _einval_serializer_response(status.HTTP_400_BAD_REQUEST, self.serializer_class)

также вот скриншот от моего почтальона

3 ответа

У меня такая же проблема. И в DRF я изменил поле на:

food_preference = fields.CharField (обязательно =False)

Тогда мне было хорошо идти.

Если у вас есть что-то вроде

CONST_Food= (
        (1, 'One'),
        (2, 'Two'),
        (3, 'Three')
    )

Затем вы должны отправить 1,2,3.

<select multiple>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>

Так что идея состоит в том, чтобы отправлять ценности.

Обновить

О, наконец-то я получил это! Вы используете django-multiselectfield (пожалуйста, добавьте его в теги, поэтому, если у кого-то возникнет та же проблема, он найдет решение быстрее), я скопировал вашу конфигурацию и, прежде всего, вместо

CONST_Food= (
            (1, 'One'),
            (2, 'Two'),
            (3, 'Three')
        )

ваш кортеж должен выглядеть

CONST_Food= (
            ('1', 'One'),
            ('2', 'Two'),
            ('3', 'Three')
        )

Проблема была в сериализаторе, который ожидает список строк, но вы отправляли список целых чисел и / или самих значений, которые он не может проанализировать. Так что ваш JSON будет

{
...
    "food_preference": ["1", "3"]
...
}
      from rest_framework import serializers
from yourapp.models import YourModel

class YourModelSerializer(serializers.ModelSerializer):
    your_multiselect_field = serializers.MultipleChoiceField(choices=YourModel.YOUR_CHOICES)

    class Meta:
        model = YourModel
        fields = '__all__'

Пункт списка

Другие вопросы по тегам