django jsonfield 保存到数据库

Posted

技术标签:

【中文标题】django jsonfield 保存到数据库【英文标题】:django jsonfield save to the database 【发布时间】:2013-08-23 12:24:34 【问题描述】:

我有一个使用 JsonField 字段的 Django 模型。

有时,我会使用 IP 地址更新该字段,然后保存该字段:

class Agent(models.Model):
    properties = jsonfield.JSONField(default = )

def save_ip_address(self, ip_address):
    self.properties['ip'] = ip_address
    self.save()

看起来很直接......不是吗?

但是该字段没有与 ip 字典项一起保存...我不知道为什么!

我做了一个可行的解决方法,但在我的代码中看起来不太好:

d = self.properties
d['ip'] = ip_address
self.properties = d 
self.save()

这样JsonField确实是用IP地址保存在数据库中的。

有谁知道为什么第一种方法不起作用?我应该怎么做才能解决它?

谢谢!

【问题讨论】:

将我的模型添加到问题中 显示你的想法是捕获 ip_address 并保存它? 是的..然后在另一个动作中,当没有IP地址时,我想去那个字典并提取最后一个已知的IP 有一个ip address field 我可以使用那个ip地址字段...但是将来我想添加另一个属性,问题会一样... 【参考方案1】:

当我尝试时,您的示例对我来说效果很好。您能否详细说明该字段未保存的含义?为了澄清我正在控制台中进行测试。使用您的模型创建了一个应用程序,打开 django 控制台并运行:

>>> from test_app.models import Agent
>>> a = Agent()
>>> a.properties = "host": "test"
>>> a.save()
>>> a.properties
'host': 'test'
>>> a.save_ip_address("127.0.0.1")
>>> a.properties
'ip': '127.0.0.1', 'host': 'test'

你能重现这些步骤以达到同样的效果吗?如果是这样,错误就在您的代码中的其他地方。

【讨论】:

我的属性字段是 'host' : 'test'。然后我保存了,它是 'ip' : '127.0.0.1', 'host' : 'test'。但是我的数据库只保留在 'host' : 'test' 中,所以下次我运行它时,我的字段中没有 'ip'。 即使在 JSONField 中使用以前的属性,我仍然可以正常工作。您是在使用 django 控制台还是在应用程序的实际部分(例如视图)进行测试?如果是后者,您可以发布它的代码。 我同意你的观点,即使在第一个示例中 a.properties 也会发生变化。我可以在调试器中看到“ip”:“127.0.0.1”。它只是没有保存在数据库中,所以下次我打开页面时,我的属性中没有它...... 您是否按照我的方式使用 django 控制台尝试过? 让我们continue this discussion in chat

以上是关于django jsonfield 保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何从 bradjasper 的 django-jsonfield 升级到 Django 的内置 jsonfield?

text jsonfield django json场没有保存

如何在 django 中从 JSONField 追加/删除数据

django postgresql json 字段模式验证

Django中的JSONField即使在POST请求后仍保持为空

django 无法访问模板中的 jsonfield 数据