2012-05-04 27 views
9

我在我的數據庫中的JSON場這就好比如何編寫一個查詢來獲取發現價值的JSON場在Django

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

我怎麼可以編寫一個查詢,這樣我可以找到如果用戶名稱存在。像

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

我知道上面的查詢是錯誤的,但我想知道是否有方法來訪問它?

回答

9

此用法有些反模式。另外,它的實現不會有正常的性能,並且或許是容易出錯。
當你需要通過字段查找時,通常不要使用jsonfield。正如Daniel指出的那樣,使用RDBMS提供的方式或MongoDB(內部運行速度更快的BSON)。

由於deterministic of JSON format, 您可以通過使用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)) 

它的工作原理,只要

  • 使用相同的轉儲實用程序(在這裏simplejson
  • namevalue太特殊(我不知道任何EGDE情況下,到目前爲止,也許有人會指出來)
  • 的jsonfield
  • 您jsonfield數據不損壞(儘管可能性不大)

其實我工作的一個編輯jsonfield並思考是否支持這樣的操作。負面的證據就像上面說的那樣,感覺就像一些黑魔法,好吧。

+0

使用'進口json'和'json.dumps(...'了'simplejson'已過時BTW,這將不起作用上的Postgres的舊版本 – andi

1

你不能那樣做。對結構化數據使用普通的數據庫字段,而不是JSON blob。

如果您需要搜索JSON數據,請考慮使用像MongoDB這樣的noSQL數據庫。

15

如果您使用的是django-jsonfield軟件包,那麼這很簡單。假設你有一個像這樣的模式:

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

然後與特定用戶名搜索記錄,你可以這樣做:

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

明顯!它不與去年(1.0.3)jsonfield工作。 –

+0

那麼,什麼是解決方案。我使用1.0.3 @ VladE.Borovtsov –

+0

嗯,我記得我發現了一些不好的解決辦法,但最終使用此字段停止。使用本地JSON在Postgres的領域很久以前。@ShashankHegde –

1

如果你使用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時的任何方法 - 看起來都非常糟糕。 所以,我也認爲你需要一個更好的數據庫模式。

1

這裏是我已經發現,將解決你的問題的方式:

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

希望這有助於。

2

由於Django 1.9,你已經能夠使用PostgreSQL的本地JSONField。這使得搜索JSON非常簡單。在你的榜樣,這個查詢將工作:

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

如果你有Django的一箇舊版本,或者您使用的是Django的JSONField庫與MySQL的兼容性或類似的東西,你仍然可以執行查詢。當進入的Django

在後一種情況下,jsonfield將被存儲爲一個文本字段,並映射到一個字典。在數據庫中,您的數據將像這樣存儲。

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

因此,您可以簡單地搜索文本。你在這個siutation查詢是:

User.objects.get(jsonfield__contains='"username":"chingo"') 
相關問題