Django save request.POST to JSONField 从列表中选择最后一项而不是保存列表

Posted

技术标签:

【中文标题】Django save request.POST to JSONField 从列表中选择最后一项而不是保存列表【英文标题】:Django save request.POST to JSONField picks last item from list instead of saving the list 【发布时间】:2022-01-17 02:03:35 【问题描述】:

我有一个从 client.post() 接收 post 请求的视图

        data = 
            "token": create_hash(customer_name),
            "images": [image_1, image_2],
            "name": customer_name,
            "email": "test@email.com",
            "phone": "0612345678",
            "product": "product-sku0",
            "font_family": "Helvetica",
            "font_size": 12,
            "colors_used": (
                "#AAAAAA|White D",
                "#FFFFFF|Black C"
            )
        

我正在尝试将发布请求作为一个整体保存到 model.JSONfield()。

post 请求键值对如下所示:

'colors_used': ['#AAAAAA|White D', '#FFFFFF|Black C']

当我保存并稍后检索该值时,它看起来像这样:

'colors_used': '#FFFFFF|Black C'

它只保存了最后一个值,而不是将嵌套列表保存在 JSON 字段中。

观点:

@csrf_exempt
def order(request):
    """
    Receives and saves request
    """

    post = request.POST
    files = request.FILES

    print(f"post=")

    assert post["token"] == create_hash(post["name"])

    design_obj = RequestDetails.objects.create(
        customer_name = post["name"],
        customer_email = post["email"],
        customer_phone = post["phone"],
        request_json = post
    )

我正在使用 SQLite。

【问题讨论】:

请发表您的看法 我已将视图添加到帖子@Jonas 【参考方案1】:

原来这只是将查询集转换为 json 字符串时的默认行为。在键级别上,您可以通过 getlist() 获取多值键的所有值。

我最终使用 json.dumps(data) 将整个嵌套数据结构放在单个 json 字符串中,然后将其与请求一起发送。

【讨论】:

以上是关于Django save request.POST to JSONField 从列表中选择最后一项而不是保存列表的主要内容,如果未能解决你的问题,请参考以下文章

基于 django RestFramework ,加工或者修改 request.POST 的数据内容

django事务中发信号怎么保证post save执行时数据已经写入数据库

save() 方法的返回类型

django 表单错误消息未显示

Django SimpleLazyObject

django重定向不重定向