如何编写一个查询,以获得在Django一个JSON领域寻找价值(how to write a que

2019-06-24 04:24发布

我在我的数据库中的JSON场这就好比

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

我怎么可以编写一个查询,这样我可以找到如果用户名存在。 就像是

username = 'chingo'
query = User.objects.get(jsonfield['username']=username)

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

Answer 1:

这种用法是有点反模式。 此外,它的实施不会有定期业绩, 或许是容易出错。
通常情况下,当你需要穿过田野查找不使用jsonfield。 使用RDBMS提供了这样或那样的MongoDB(它在内部更快的运行BSON),丹尼尔指出。

由于确定性JSON格式的 ,你可以通过实现它containsregex处理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))

它的工作原理,只要

  • (在使用相同的转储程序的jsonfield simplejson这里)
  • namevalue都没有太特殊 (我不知道任何EGDE情况下,到目前为止,也许有人会指出来)
  • 您jsonfield数据不损坏(尽管可能性不大)

其实,我工作的一个编辑jsonfield并思考是否支持这样的操作。 负举证如上所说,那感觉就像一些黑魔法,很好。



Answer 2:

如果您使用的是Django的jsonfield包,那么这很简单。 假设你有一个像这样的模式:

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

然后用特定的用户名搜索记录,你可以这样做:

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


Answer 3:

由于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"')


Answer 4:

如果你使用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工作就像纯文本 - 看起来像很糟糕的方式。 所以,我也认为你需要数据库的一个更好的架构。



Answer 5:

这是我发现的方式,将解决你的问题:

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

希望这可以帮助。



Answer 6:

你不能做到这一点。 使用结构化数据,而不是JSON斑点正常的数据库字段。

如果您需要在JSON数据中进行搜索,可以考虑使用NoSQL数据库MongoDB的一样。



文章来源: how to write a query to get find value in a json field in django