使用Django的JSONField的注释和常规查询之间有什么区别?

时间:2019-03-17 19:21:05

标签: django django-postgresql django-jsonfield

您可以通过直接查找或使用批注来查询Django的JSONField。现在我意识到,如果您对字段进行注释,则可以进行各种复杂的查询,但是对于最基本的查询,实际上哪个是首选方法?

示例:假设我有这样的模型

class Document(models.Model):
    data = JSONField()

然后我使用以下命令存储对象:

>>> Document.objects.create(data={'name': 'Foo', 'age': 24})

现在,我想要的查询是最基本的:查找data__name'Foo'的所有文档。我可以通过两种方式做到这一点,一种使用注释,另一种不使用注释,就像这样:

>>> from django.db.models.expressions import RawSQL
>>> Document.objects.filter(data__name='Foo')
>>> Document.objects.annotate(name = RawSQL("(data->>'name')::text", [])).filter(name='Foo')

那么到底有什么区别呢?如果我可以进行基本查询,为什么需要注释?当然,我不会进行复杂的查询。

2 个答案:

答案 0 :(得分:1)

没有任何理由在可以使用ORM语法的地方使用原始SQL进行查询。对于精通SQL但不熟悉Django ORM的人来说,RawSQL可能比具有自己的学习曲线的ORM提供更简单的方法来获得特定结果。

在ORM runs into problemsmight not会为您提供所需的确切SQL查询的地方,可能会有更复杂的查询。在这些情况下,RawSQL会派上用场-尽管每次迭代ORM都会获得更多功能完善的

  • Cast(自1.10开始),
  • Window函数(自2.0开始),
  • 数据库功能包装器的数量不断增长
  • 使用Func expressions(自1.8开始)等为数据库函数定义自定义包装的功能。

答案 1 :(得分:0)

它们是可互换的,因此与口味有关。我认为Document.objects.filter(data__name='Foo')更好,因为:

  • 更容易阅读
  • 将来,MariaDB或MySql可以支持JSON字段,并且您的代码将能够在PostgreSQL和MariaDB上运行。
  • 请勿将RawSQL用作一般规则。您可以在应用中创建安全漏洞。