如何编写查询以获取django中json字段中的查找值

时间:2012-05-04 08:18:06

标签: django django-models django-queryset

我的数据库中有一个json字段,就像

jsonfield = {'username':'chingo','reputation':'5'}

如何编写查询以便我可以找到用户名是否存在。

之类的东西
username = 'chingo'
query = User.objects.get(jsonfield['username']=username)

我知道上面的查询是错误的,但我想知道是否有办法访问它?

7 个答案:

答案 0 :(得分:20)

如果您使用的是django-jsonfield软件包,那么这很简单。假设你有这样的模型:

from jsonfield import JSONField
class User(models.Model):
    jsonfield = JSONField()

然后要搜索具有特定用户名的记录,您可以这样做:

User.objects.get(jsonfield__contains={'username':username})

答案 1 :(得分:10)

这种用法有些反模式。此外,它的实现不会有正常的性能,或许容易出错 通常在需要查看字段时不要使用jsonfield。正如Daniel指出的那样,使用RDBMS提供的方式或MongoDB(内部以更快的BSON运行)。

由于deterministic of JSON format, 您可以使用contains来实现它(regex在处理多个'\'时遇到问题,甚至更慢),我认为使用 {{1}并不好以这种方式,所以请改用 username

name

只要

就可以
  • jsonfield使用相同的转储实用程序(此处为def make_cond(name, value): from django.utils import simplejson cond = simplejson.dumps({name:value})[1:-1] # remove '{' and '}' return ' ' + cond # avoid '\"' User.objects.get(jsonfield__contains=make_cond(name, value))
  • simplejson name 不是太特别(我不知道任何egde-case所以远,也许有人可以指出来)
  • 你的jsonfield数据没有损坏(不太可能)

实际上我正在编写一个可编辑的jsonfield并考虑是否支持这样的操作。负面证据如上所述,感觉就像是一些黑魔法,好吧。

答案 2 :(得分:7)

自Django 1.9以来,您已经能够使用PostgreSQL的原生JSONField。这使得搜索JSON非常简单。在您的示例中,此查询将起作用:

User.objects.get(jsonfield__username='chingo')

如果你有旧版本的Django,或者你正在使用Django JSONField库来兼容MySQL或类似的东西,你仍然可以执行查询。

在后一种情况下,jsonfield将被存储为文本字段,并在进入Django时映射到dict。在数据库中,您的数据将像这样存储

{"username":"chingo","reputation":"5"}

因此,您只需搜索文本即可。您在此过程中的查询将是:

User.objects.get(jsonfield__contains='"username":"chingo"')

答案 3 :(得分:1)

如果您使用PostgreSQL,您可以使用原始SQL来解决问题。

ho

其中$('#bg1').on({ mouseover: function(){ $('span').css("color","orange"); }, mouseleave: function(){ $('span').css("color",$('#currentColor').css("color")); }, click: function(){ $('.ho').on('mouseleave'); $(this).off('mouseleave'); $('#currentColor').css("color","orange") } }); $('#bg2').on({ mouseover: function(){ $('span').css("color","magenta"); }, mouseleave: function(){ $('span').css("color",$('#currentColor').css("color")); }, click: function(){ $('.ho').on('mouseleave'); $(this).off('mouseleave'); $('#currentColor').css("color","magenta") } }); 是数据库中表的名称。

使用JSON时的任何方法都与纯文本一样 - 看起来非常糟糕。 所以,我认为你需要一个更好的数据库模式。

答案 4 :(得分:1)

以下是我发现的解决问题的方法:

search_filter = '"username":{0}'.format(username)
query = User.objects.get(jsonfield__contains=search_filter)

希望这有帮助。

答案 5 :(得分:0)

你做不到。将正常数据库字段用于结构化数据,而不是JSON blob。

如果您需要搜索JSON数据,请考虑使用像MongoDB这样的noSQL数据库。

答案 6 :(得分:0)

2019年:正如@freethebees指出的那样,现在变得如此简单:

User.objects.get(jsonfield__username='chingo')

但是正如doc示例所提到的,您可以深入查询,如果json是数组,则可以使用整数对其进行索引:

https://docs.djangoproject.com/en/2.2/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', 'owner': None})

>>> Dog.objects.filter(data__breed='collie')
<QuerySet [<Dog: Meg>]>

>>> Dog.objects.filter(data__owner__name='Bob')
<QuerySet [<Dog: Rufus>]>

>>> Dog.objects.filter(data__owner__other_pets__0__name='Fishy')
<QuerySet [<Dog: Rufus>]>

尽管这是针对postgres的,但我相信它在其他数据库(如MySQL)中的作用相同