【问题标题】:How to get and process Input for django-multiselectfield in Django rest framework via form-data如何通过表单数据在Django rest框架中获取和处理django-multiselectfield的输入
【发布时间】:2018-08-10 11:00:35
【问题描述】:

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

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

现在我的问题是如何使用表单数据从用户那里获取输入,以及如何在我的视图或序列化程序中处理它,截至目前,当我尝试插入选项时使用邮递员和表单数据 已选中,这在调用 serializer.is_valid() 时给我一个错误

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

下面是我的代码 sn-p。

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

这也是我邮递员的截图

【问题讨论】:

    标签: django django-rest-framework multichoiceitems


    【解决方案1】:

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

    food_preference = fields.CharField(required=False)

    然后我就可以走了。

    【讨论】:

    • 这绝对是解决方法。如pypi.org/project/django-multiselectfield 中所述,我在我的序列化程序中添加了fields.MultipleChoiceField(choices=MY_CHOICES),但我没有工作。这很奇怪!!!
    【解决方案2】:

    如果你有类似的东西

    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"]
    ...
    }
    

    【讨论】:

    • 试过了,同样的错误。 1 & 2 不是一个有效的选择
    • 我尝试将 django-multiselectfield 添加为标签,但没有足够的声誉来创建新标签。你看。
    • @SumeetKumar 请出示您发送的 CONST_Food 和 JSON
    • 不是以 JSON 格式发送,而是以multipart/form-data 发送,因为我的原始序列化程序包含图像,而且我正在使用解析器。
    • @SumeetKumar 请检查一下,现在我不确定这个问题是否与 drf 或 django 但邮递员 stackoverflow.com/a/23735006/7396169
    猜你喜欢
    • 2016-08-21
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多