我的数据库中有一个json字段,就像
jsonfield = {'username':'chingo','reputation':'5'}
如何编写查询以便我可以找到用户名是否存在。
之类的东西username = 'chingo'
query = User.objects.get(jsonfield['username']=username)
我知道上面的查询是错误的,但我想知道是否有办法访问它?
答案 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
只要
就可以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并考虑是否支持这样的操作。负面证据如上所述,感觉就像是一些黑魔法,好吧。
答案 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)中的作用相同