Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解Django JSONField键路径查询和穷举集_Django_Postgresql_Jsonb - Fatal编程技术网

了解Django JSONField键路径查询和穷举集

了解Django JSONField键路径查询和穷举集,django,postgresql,jsonb,Django,Postgresql,Jsonb,当我在网上查看Django文档时,我看到一张便条,上面写着: 由于关键路径查询的工作方式,无法保证生成穷举集。如果要包括没有路径的对象,请添加isnull查找 有人能给我举一个不会产生穷举集的查询的例子吗?我很难想出一个答案。这是导致您引用的文档的原因: TL;DR:要获得JSON密钥路径上的.filter()的相反结果,仅将.exclude()与同一子句一起使用是不够的,因为它只会提供JSON密钥路径存在但具有不同值的记录,而不会提供JSON密钥路径根本不存在的记录。这就是为什么它说: 如果要

当我在网上查看Django文档时,我看到一张便条,上面写着:

由于关键路径查询的工作方式,无法保证生成穷举集。如果要包括没有路径的对象,请添加
isnull
查找


有人能给我举一个不会产生穷举集的查询的例子吗?我很难想出一个答案。

这是导致您引用的文档的原因:

TL;DR:要获得JSON密钥路径上的
.filter()
的相反结果,仅将
.exclude()
与同一子句一起使用是不够的,因为它只会提供JSON密钥路径存在但具有不同值的记录,而不会提供JSON密钥路径根本不存在的记录。这就是为什么它说:

如果要包括没有路径的对象,请添加isnull查找


请允许我在这里引用机票描述:

基于JSONField键值对的筛选似乎有一些问题 涉及并非所有记录都具有的密钥时出现意外行为。 奇怪的是,对可选属性键进行筛选不会返回 同一属性键上的排除将显示的反向结果集 返回

在我的数据库中,我有:

  • 2250共记录49条记录,其中jsonfieldname={'propertykey':'PropertyValue'}
  • 296记录,其中jsonfieldname有一个带有其他值的“propertykey”键
  • 1905记录,其中jsonfieldname根本没有“propertykey”键
以下代码:

q = Q(jsonfieldname__propertykey="PropertyValue")

total_records = Record.objects.count()
filtered_records = Record.objects.filter(q).count()
excluded_records = Record.objects.exclude(q).count()
filtered_plus_excluded_records = filtered_records + excluded_records

print('Total: %d' % total_records)
print('Filtered: %d' % filtered_records)
print('Excluded: %d' % excluded_records)
print('Filtered Plus Excluded: %d' % filtered_plus_excluded_records)
将输出以下内容:

Total: 2250
Filtered: 49
Excluded: 296
Filtered Plus Excluded: 345
令人惊讶的是,过滤+排除值不等于总记录计数。令人惊讶的是,一个表达式的并集加上它的倒数并不等于所有记录的和。我不知道Django中还有任何其他查询会返回这样的结果。我意识到添加一个检查键exists将返回一个更预期的结果,但这并不能阻止上述结果令人惊讶

我不确定解决方案是什么——要么在文档中注明应该出现这种行为,要么看看这个表达式是如何应用于exclude()和filter()查询的,看看为什么它们不是对立的


这是导致您引用的文档的票证:

TL;DR:要获得JSON密钥路径上的
.filter()
的相反结果,仅将
.exclude()
与同一子句一起使用是不够的,因为它只会提供JSON密钥路径存在但具有不同值的记录,而不会提供JSON密钥路径根本不存在的记录。这就是为什么它说:

如果要包括没有路径的对象,请添加isnull查找


请允许我在这里引用机票描述:

基于JSONField键值对的筛选似乎有一些问题 涉及并非所有记录都具有的密钥时出现意外行为。 奇怪的是,对可选属性键进行筛选不会返回 同一属性键上的排除将显示的反向结果集 返回

在我的数据库中,我有:

  • 2250共记录49条记录,其中jsonfieldname={'propertykey':'PropertyValue'}
  • 296记录,其中jsonfieldname有一个带有其他值的“propertykey”键
  • 1905记录,其中jsonfieldname根本没有“propertykey”键
以下代码:

q = Q(jsonfieldname__propertykey="PropertyValue")

total_records = Record.objects.count()
filtered_records = Record.objects.filter(q).count()
excluded_records = Record.objects.exclude(q).count()
filtered_plus_excluded_records = filtered_records + excluded_records

print('Total: %d' % total_records)
print('Filtered: %d' % filtered_records)
print('Excluded: %d' % excluded_records)
print('Filtered Plus Excluded: %d' % filtered_plus_excluded_records)
将输出以下内容:

Total: 2250
Filtered: 49
Excluded: 296
Filtered Plus Excluded: 345
令人惊讶的是,过滤+排除值不等于总记录计数。令人惊讶的是,一个表达式的并集加上它的倒数并不等于所有记录的和。我不知道Django中还有任何其他查询会返回这样的结果。我意识到添加一个检查键exists将返回一个更预期的结果,但这并不能阻止上述结果令人惊讶

我不确定解决方案是什么——要么在文档中注明应该出现这种行为,要么看看这个表达式是如何应用于exclude()和filter()查询的,看看为什么它们不是对立的