我需要将一个JSON字符串保存到Django模型中,想知道应该使用哪种字段类型。之前我见过使用JSONField
的情况,但是既然JSON本身就是一个字符串,那么使用TextField
也完全可以胜任这个工作,对吗?
应该使用哪种字段类型呢?
到一定程度上来说,这是正确的,但是对于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/