【问题标题】:How to save multipart / formdata turned into a QueryDict using Django REST Framework (DRF) and ModelSerializer如何使用 Django REST Framework (DRF) 和 ModelSerializer 将 multipart / formdata 保存为 QueryDict
【发布时间】:2022-10-02 02:19:45
【问题描述】:

我正在从 Next.js API 发送 multipart/formdata,我可以以任何我想要的方式格式化数据,但我正在努力获得正确的格式。

现在,我有以下表单数据:

<QueryDict: {
    \'name\': [\'Test Product\'],
    \'brands[0]\': [\'1\'],
    \'brands[1]\': [\'2\'],
    \'option_types[0]\': [\'1\'],
    \'product_variants[0]option_values[0]\': [\'1\'],
    \'product_variants[0]option_values[1]\': [\'2\'],
 >

和以下模型序列化器:

class ProductDetailAdminSerializer(
    UniqueFieldsMixin, ProductAdminMixin, WritableNestedModelSerializer
):
    categories = PrimaryKeyRelatedField(
        many=True, allow_null=True, queryset=Category.objects.all()
    )
    option_types = PrimaryKeyRelatedField(
        many=True, allow_null=True, queryset=OptionType.objects.all()
    )
    brands = PrimaryKeyRelatedField(
        many=True, allow_null=True, queryset=Brand.objects.all()
    )
    product_variants = ProductVariantDetailAdminSerializer(many=True)

    class Meta:
        model = Product
        fields = (
            \"pk\",
            \"name\",
            \"subtitle\",
            \"sku_symbol\",
            \"categories\",
            \"brands\",
            \"description\",
            \"option_types\",
            \"product_variants\",
        )

我的 ModelSerializer 不接受我指定列表/数组的方式。例如,如果我尝试这样做:

def validate_option_types(self, data):
    print(data)
    return data

我得到一个空列表,这意味着option_types 列表的格式错误,product_variantsoption_values 也是如此。我只是传递从request.data 获得的 QueryDict,如下所示:

def create(self, request, *args, **kwargs):
    serializer = ProductDetailAdminSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return JsonResponse(serializer.data)
    return JsonResponse(serializer.errors, status=400)

如果我使用上面的 QueryDict 的 JSON 版本和 JSON 内容类型,则序列化程序和其他一切都可以正常工作。顺便说一句,如果我使用ListField 而不是PrimaryKeyRelatedField 它也可以按预期工作,尽管ListField 实际上并没有给我所需的对象。

所以总结一下我的问题,DRF ModelSerializer 的正确 QueryDict 格式(特别是代表列表的字段)是什么?或者,在将 QueryDict 转换为模型序列化程序所期望的格式时,我是否缺少一个额外的步骤。

  • 品牌、option_types 和产品变体是多对多字段吗?如果是,那么这不是正确的方法。
  • 嗨@RanuVijay。 brandsoption_types 是多对多,但 product_variants 是多对一。正确的方法是什么?谢谢。

标签: django rest django-rest-framework multipart form-data


【解决方案1】:

好的,您不能像尝试那样添加多对多类型字段 -

首先创建没有多对多字段的对象

obj = MyModal.save()

然后获取对象 ID

muObj = obj.id

然后你可以做类似的事情 - 创建和添加您的多对多字段。

myObj.brand.create(name='val1')
myObj.option_types.create(name='val2')

您还可以搜索 StackOverflow 以了解如何将数据添加到 ManyToManyFields

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2017-03-21
    • 2021-02-06
    • 2014-09-21
    • 2020-07-29
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多