我目前对在django rest-framework中使用JSONField很熟悉,但是我找不到更新存储json中密钥的任何直接方法。过滤JSONField的方法有很多,取决于它的内部键,但是似乎没有办法从已存储的JSONField中更改,更新或删除键。但是似乎postgres可以对json键做一些修改,如这个答案所解释。
是否有任何功能可以对JSONFields进行修改。如果没有任何直接命令可以执行此操作,那么实现JSONField修改的最佳方法是什么?
编辑:
例如,如果我有一个这样的模型:
class Thing(models.Model):
name = models.CharField()
properties = JSONField()
Run Code Online (Sandbox Code Playgroud)
在properties我存储这样的json:
{
"color" : "red",
"size" : "large",
"cost" : 1234
}
Run Code Online (Sandbox Code Playgroud)
然后,我想使用django命令将颜色更改为“绿色”。
假设我有一个函数const string&作为其输入,例如:
void foo(const string& s);
Run Code Online (Sandbox Code Playgroud)
然后我有一个内部缓冲区const char* buffer;,我知道它的大小.
我想如果我创建字符串内联,仍然会发生一个副本:
foo(string(buffer, n));
Run Code Online (Sandbox Code Playgroud)
但是没有必要复制缓冲区,因为所有东西都是常量,我只需要字符串类的功能而不是它创建的缓冲区.
我必须提到我不确定复制是否发生,但是查看字符串的构造函数,所有人都说复制会发生.我不知道编译器优化是否可以理解这种情况,我找不到确定复制是否发生的方法.
有没有办法为字符串使用外部缓冲区,或者至少是确保复制发生与否的方法.我目前正在使用std字符串和c ++ 11.
假设打击代码:
#include <map>
using namespace std;
int main(int argc, char *argv[])
{
map<int, std::array<int, 2>> a;
a.emplace(piecewise_construct,
forward_as_tuple(1),
forward_as_tuple({1, 2}));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想std::array使用初始化列表放置 a 。但我收到了这个错误:
foo.cc: In function ‘int main(int, char**)’:
foo.cc:13:36: error: too many arguments to function ‘std::tuple<_Elements&& ...> std::forward_as_tuple(_Elements&& ...) [with _Elements = {}]’
forward_as_tuple({1, 2}));
^
In file included from /usr/include/c++/4.8/bits/stl_map.h:63:0,
from /usr/include/c++/4.8/map:61,
from foo.cc:3:
/usr/include/c++/4.8/tuple:869:5: note: declared here
forward_as_tuple(_Elements&&... __args) noexcept
^
Run Code Online (Sandbox Code Playgroud)
我知道有很多方法可以实现这一点,但我的问题是关于forward_as_tuple为什么它不简单地将初始化列表发送到的构造函数的错误行为std::array?
我使用 c++11 和 g++-4.8.4。