如何通过表单数据获取和处理Django REST框架中django-multiselectfield的输入

dkqlctbz  于 12个月前  发布在  Go
关注(0)|答案(3)|浏览(169)

我有User模型与food_prefrence字段,用户可以选择多个选项。
在模型中,我使用来自django-multiselectfieldMultiSelectField来解决我的问题。在我的User序列化器中,我使用rest-framework提供的fields.MultipleChoiceField。
现在我的问题是如何使用form-data从用户那里获取输入,以及如何在我的视图或序列化程序中处理它,到目前为止,当我试图插入选择using postman with form-dataselected时,当调用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)


这里也是我的 Postman x1c 0d1x的截图

6rvt4ljy

6rvt4ljy1#

我也遇到了同样的问题。在DRF中,我将字段改为:
food_preference = fields.CharField(required=False)
然后我就可以走了。

7uzetpgm

7uzetpgm2#

如果你有类似于

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')
        )


问题出在序列化器中,它需要字符串列表,但您发送的是它无法解析的整数和/或值列表本身。

{
...
    "food_preference": ["1", "3"]
...
}

bfrts1fy

bfrts1fy3#

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__'

字符串
列表项

相关问题