Django JSONField与TextField的区别

11

我需要将一个JSON字符串保存到Django模型中,想知道应该使用哪种字段类型。之前我见过使用JSONField的情况,但是既然JSON本身就是一个字符串,那么使用TextField也完全可以胜任这个工作,对吗?

应该使用哪种字段类型呢?

1个回答

11

到一定程度上来说,这是正确的,但是对于PostgreSQL(现在所有数据库后端,见下文),至少有一个特定的数据库JSON字段类型。这意味着您可以基于该字段的内容查询模型。参考Django文档https://docs.djangoproject.com/en/2.0/ref/contrib/postgres/fields/#querying-jsonfield

>>> Dog.objects.create(name='Rufus', data={
...     'breed': 'labrador',
...     'owner': {
...         'name': 'Bob',
...         'other_pets': [{
...             'name': 'Fishy',
...         }],
...     },
... })
>>> Dog.objects.create(name='Meg', data={'breed': 'collie'})

>>> Dog.objects.filter(data__breed='collie')
<QuerySet [<Dog: Meg>]>
此外,当您执行 dog.data 时,字段值会自动转换为其本机Python格式,即字典格式。如果使用TextField,则需要显式地执行 data = json.reads(dog.data) 步骤来进行转换。(我相信这是在字段类型的 from_db_value() 方法中发生的。)

2020年8月4日更新:从Django 3.1开始,JSONField可以在所有受支持的数据库后端中使用 https://www.djangoproject.com/weblog/2020/aug/04/django-31-released/


什么是PostgreSQL?它是另一种数据库类型吗?如果是,我是否仍然可以在默认的sqlite3数据库中使用JSONField? - cbuch1800
1
是的。Django支持多种数据库,但最常见的可能是Postgres,也称为PostgreSQL。请参阅文档中的数据库。JSONField在sqlite3上不起作用。我没有尝试过,但我猜当您尝试运行迁移时它会失败。 - nimasmi
1
关于sqlite3和JSONField迁移,运行得很好,但添加一个带有JSONField的模型会导致错误。 - fanny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接