您可以通过直接查找或使用批注来查询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')
那么到底有什么区别呢?如果我可以进行基本查询,为什么需要注释?当然,我不会进行复杂的查询。
答案 0 :(得分:1)
没有任何理由在可以使用ORM语法的地方使用原始SQL进行查询。对于精通SQL但不熟悉Django ORM的人来说,RawSQL
可能比具有自己的学习曲线的ORM提供更简单的方法来获得特定结果。
在ORM runs into problems或might not会为您提供所需的确切SQL查询的地方,可能会有更复杂的查询。在这些情况下,RawSQL会派上用场-尽管每次迭代ORM都会获得更多功能完善的
答案 1 :(得分:0)
它们是可互换的,因此与口味有关。我认为Document.objects.filter(data__name='Foo')
更好,因为: