Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在django中编写查询以在json字段中查找值_Django_Django Models_Django Queryset - Fatal编程技术网

如何在django中编写查询以在json字段中查找值

如何在django中编写查询以在json字段中查找值,django,django-models,django-queryset,Django,Django Models,Django Queryset,我的数据库中有一个json字段 jsonfield = {'username':'chingo','reputation':'5'} 如何编写查询以便查找用户名是否存在。差不多 username = 'chingo' query = User.objects.get(jsonfield['username']=username) 我知道上面的查询是错误的,但我想知道是否有方法访问它?您不能这样做。对结构化数据使用常规数据库字段,而不是JSON blob 如果需要搜索JSON数据,请考虑使用像

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

jsonfield = {'username':'chingo','reputation':'5'}
如何编写查询以便查找用户名是否存在。差不多

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

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

您不能这样做。对结构化数据使用常规数据库字段,而不是JSON blob


如果需要搜索JSON数据,请考虑使用像MunGDB这样的NoSQL数据库。< /P> < P>此用法有点反模式。而且,它的实现不会有正常的性能,而且可能容易出错。
当需要查找字段时,通常不使用jsonfield。正如Daniel指出的那样,使用RDBMS提供的方式或MongoDB(它在内部运行在更快的BSON上)

由于,, 您可以通过使用
contains
regex
在处理多个
'\'
时有问题,甚至更慢),我认为这样使用
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
  • name
    value
    并不特别(到目前为止我还不知道egde的案例,也许有人可以指出)
  • 您的jsonfield数据未损坏(但可能性不大)

实际上,我正在处理一个可编辑的jsonfield,并考虑是否支持此类操作。否定证明如上所述,它感觉像是某种黑魔法。

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

from jsonfield import JSONField
class User(models.Model):
    jsonfield = JSONField()
然后,要搜索具有特定用户名的记录,只需执行以下操作:

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

若你们使用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\u table
是数据库中表的名称

任何处理JSON的方法都像处理纯文本一样——看起来非常糟糕。
因此,我还认为您需要更好的数据库模式。

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

search_filter=''username:{0}'。格式(username)
query=User.objects.get(jsonfield\uuuu contains=search\u filter)

希望这有帮助。

自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"')

2019年:正如@freethebees指出的那样,现在的问题很简单:

User.objects.get(jsonfield__username='chingo')
但正如文档示例所述,您可以深入查询,如果json是一个数组,则可以使用整数对其进行索引:

>Dog.objects.create(name='Rufus',data={
…品种:'拉布拉多',
…“所有者”:{
…'姓名':'鲍勃',
…其他宠物:[{
…名称:'鱼',
...         }],
...     },
... })
>>>创建(name='Meg',data={'bride':'collie','owner':None})
>>>Dog.objects.filter(data\uu breed='collie')
>>>Dog.objects.filter(数据\所有者\名称='Bob')
>>>Dog.objects.filter(数据\uuuu所有者\uuuu其他\uu宠物\uuuuuu 0\uuuu name='Fishy')
虽然这是针对postgres的,但我相信它在其他数据库(如MySQL)中也能起到同样的作用

  • 博士后:
  • MySQL:

显然,它不适用于last(1.0.3)jsonfield。那么解决方案是什么呢。我正在使用1.0.3@VladE.BorovtsovHmm,我记得我找到了一些糟糕的解决方案。但最终停止使用这个字段。很久以前在postgres中使用本机json字段@ShashankHegdeYes。甚至我也会尝试从mysql迁移到postgres,并开始使用django 1.9中内置的JsonField。感谢您的回复您可以使用
User.objects.get(jsonfield\uuuu contains=''username:'{}'.format(username))
use
import json
json.dumps(…
simplejson已被弃用。顺便说一句,这在旧版本的postgres上不起作用!答案相当过时
>>> 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>]>