当前位置: 首页 > 面试题库 >

ArrayField内的Django JSONField

查飞星
2023-03-14
问题内容

我在使用带有JSONField的ArrayField插入字段时遇到问题。

models.py

locations = ArrayField(JSONField(null = True,blank = True), blank=True, null = True)

location_arr = [{"locations" : "loc1","amount":Decimal(100.00)},{"locations" : "loc2","amount":Decimal(200.25)}]
instance.locations = location_arr
instance.save()

当我这样做时,我得到了

列“ locations”的类型为jsonb [],但表达式的类型为text []

第1行:… d“ = 2517,”位置“ = ARRAY [‘{” loc …

提示:您将需要重写或强制转换表达式。

所以我尝试使用以下方法转储它:

import json
location_arr = [{"locations" : "loc1","amount":Decimal(100.00)},{"locations" : "loc2","amount":Decimal(200.25)}]
instance.locations = json.dumps(location_arr)
instance.save()

然后我得到了

第1行:… d“ = 2517,”位置“ =’[{” loc“:…

详细信息:“ [”必须引入显式指定的数组维。

我在用:

  1. 的Django 1.9
  2. Python 2.7
  3. PostgreSQL 9.4.10
  4. psycopg2 2.6.2

问题答案:

数组

首先,让我们仔细看一下Postgresql
Arrays
文档中的这一重要文本。

提示:数组不是集合;搜索特定的数组元素可能是数据设计错误的标志。考虑使用单独的表,该表的每个行都将是一个数组元素。这将更易于搜索,并且可能会针对大量元素进行更好地缩放。

大多数时候,您不应该使用数组。

JSONB

JSONB在Django中可作为JSONField类型使用。该字段比数组字段更具可伸缩性和灵活性,并且可以更有效地进行搜索。但是,如果您发现自己始终在JSONB字段中进行搜索,则上述有关数组的声明对JSONB同样有效。

现在您的系统中有什么?一个包含JSONB字段的数组。这是一场灾难,等待发生。请规范化您的数据。

回顾

那么什么时候使用ArrayField?

在极少数情况下,您不需要在该列中进行搜索,也不需要使用该列进行联接。



 类似资料:
  • 我最近需要在一个JScrollPane的viewport视图中放置几个组件,其中包括一个JTextPane。 我将所有组件(两个JPanel和JTextPane)放在另一个JPanel中,这个JPanel有一个BorderLayout LayoutManager,并将该JPanel设置为ScrollPane的viewport视图。 我立即注意到: JTextPane不再根据JScrollPane的

  • 我有一个叫做CatalogPane的JPanel,它的大小是800 x 600,它位于一个叫做BookFrame的JFrame中的JTabbedPane中。因此,在CatalogPane中,我创建了一个名为bookDisplay的JPanel,它显示书籍及其详细信息的列表。我希望它的大小为780 x 900,滚动条的大小为20px,并且比框架高,这样就可以滚动。然后我创建了一个尺寸为800 x 4

  • 我有一个ui显示的数据表:repeat。因为我希望用户能够在每行的基础上更改数据,所以每行都包含在一个h:form中。最后,每个h:form都有一个带有f:ajax标记的按钮。我的行为越来越不一致。 上述方法可行,但带宽显然不便宜。 如果我将render=“@all”更改为render=“@form”,Firebug显示发送的部分响应正常,但我的浏览器(Firefox)神秘地没有显示它。所以我猜它

  • 问题内容: 我正在与AngularJS一起显示应用程序键(应用程序标识符)表,我想使用编辑按钮在该表行中显示一个小表格。然后用户可以编辑字段并单击“保存”或“取消” 演示:http://jsfiddle.net/Thw8n/ 我的内联表单效果很好。我单击编辑,然后出现一个表格。取消也很棒。 我的问题是 如何连接保存按钮和将对API进行$ http调用的函数 如何从该行获取数据以发送到$ http调

  • Widget 是Django 对HTML 输入元素的表示。Widget 负责渲染HTML和提取GET/POST 字典中的数据。 小贴士 不要将Widget 与表单字段搞混淆。表单字段负责验证输入并直接在模板中使用。Widget 负责渲染网页上HTML 表单的输入元素和提取提交的原始数据。但是,Widget 需要赋值给表单的字段。 指定Widget 每当你指定表单的一个字段的时候,Django 将使

  • 这是我的绳子 我需要获取和中的文本 我怎么能这样做呢? 我试过了 这是我的小提琴 但是我得到的错误是 未捕获的类型错误:a.getElementsByTagName不是函数 我该怎么做 注意: 这不是来自网站的内容,我试图从其他语句中获取文本,所以我将响应分配给一个变量并处理它。 我只需要使用脚本来执行此操作