Как получить и обработать Ввод для 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__'
Пункт списка