3

我有User带有food_prefrence字段的模型,用户可以选择多个选项。

在模型中,我使用MultiSelectFieldfrom django-multiselectfield来解决我的问题。在我的用户序列化程序中,我使用的是由 rest-framework 提供的 fields.MultipleChoiceField。

现在我的问题是如何使用表单数据从用户那里获取输入以及如何在我的视图或序列化程序中处理它,截至目前,当我尝试使用邮递员插入选择并选择表单数据时,这给了我一个错误何时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)

这也是我邮递员的截图 在此处输入图像描述

4

2 回答 2

1

我有同样的问题。在 DRF 中,我将字段更改为:

food_preference = fields.CharField(required=False)

然后我就可以走了。

于 2019-01-08T14:23:37.047 回答
0

如果你有类似的东西

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"]
...
}
于 2018-03-02T12:23:00.993 回答