我在我的数据库中的JSON场这就好比
jsonfield = {'username':'chingo','reputation':'5'}
我怎么可以编写一个查询,这样我可以找到如果用户名存在。 就像是
username = 'chingo'
query = User.objects.get(jsonfield['username']=username)
我知道上面的查询是错误的,但我想知道是否有访问它的方法吗?
我在我的数据库中的JSON场这就好比
jsonfield = {'username':'chingo','reputation':'5'}
我怎么可以编写一个查询,这样我可以找到如果用户名存在。 就像是
username = 'chingo'
query = User.objects.get(jsonfield['username']=username)
我知道上面的查询是错误的,但我想知道是否有访问它的方法吗?
这种用法是有点反模式。 此外,它的实施不会有定期业绩, 或许是容易出错。
通常情况下,当你需要穿过田野查找不使用jsonfield。 使用RDBMS提供了这样或那样的MongoDB(它在内部更快的运行BSON),丹尼尔指出。
由于确定性JSON格式的 ,你可以通过实现它contains
( regex
处理W /多的时候有问题'\'
,甚至更慢),我不认为这是很好的使用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
和value
都没有太特殊 (我不知道任何EGDE情况下,到目前为止,也许有人会指出来) 其实,我工作的一个编辑jsonfield并思考是否支持这样的操作。 负举证如上所说,那感觉就像一些黑魔法,很好。
如果您使用的是Django的jsonfield包,那么这很简单。 假设你有一个像这样的模式:
from jsonfield import JSONField
class User(models.Model):
jsonfield = JSONField()
然后用特定的用户名搜索记录,你可以这样做:
User.objects.get(jsonfield__contains={'username':username})
由于Django的1.9,你已经能够使用PostgreSQL的本地JSONField。 这使得搜索JSON很简单。 在你的榜样,这个查询会工作:
User.objects.get(jsonfield__username='chingo')
如果你有Django的一个旧版本,或者您使用的是Django的JSONField库与MySQL的兼容性或类似的东西,你仍然可以执行查询。
在后一种情况下, jsonfield
将被存储为文本字段时带入的Django映射到一个字典。 在数据库中,您的数据将存储这样
{"username":"chingo","reputation":"5"}
因此,你可以简单地搜索的文本。 你在这个siutation查询应为:
User.objects.get(jsonfield__contains='"username":"chingo"')
如果你使用PostgreSQL,你可以使用原始SQL来解决问题。
username = 'chingo'
SQL_QUERY = "SELECT true FROM you_table WHERE jsonfield::json->>'username' = '%s'"
User.objects.extra(where=[SQL_EXCLUDE % username]).get()
其中you_table
是在你的数据库表的名称。
任何方法,当你使用JSON工作就像纯文本 - 看起来像很糟糕的方式。 所以,我也认为你需要数据库的一个更好的架构。
这是我发现的方式,将解决你的问题:
search_filter = '"username":{0}'.format(username)
query = User.objects.get(jsonfield__contains=search_filter)
希望这可以帮助。
你不能做到这一点。 使用结构化数据,而不是JSON斑点正常的数据库字段。
如果您需要在JSON数据中进行搜索,可以考虑使用NoSQL数据库MongoDB的一样。