我在我的數據庫中的JSON場這就好比如何編寫一個查詢來獲取發現價值的JSON場在Django
jsonfield = {'username':'chingo','reputation':'5'}
我怎麼可以編寫一個查詢,這樣我可以找到如果用戶名稱存在。像
username = 'chingo'
query = User.objects.get(jsonfield['username']=username)
我知道上面的查詢是錯誤的,但我想知道是否有方法來訪問它?
我在我的數據庫中的JSON場這就好比如何編寫一個查詢來獲取發現價值的JSON場在Django
jsonfield = {'username':'chingo','reputation':'5'}
我怎麼可以編寫一個查詢,這樣我可以找到如果用戶名稱存在。像
username = 'chingo'
query = User.objects.get(jsonfield['username']=username)
我知道上面的查詢是錯誤的,但我想知道是否有方法來訪問它?
此用法有些反模式。另外,它的實現不會有正常的性能,並且或許是容易出錯。
當你需要通過字段查找時,通常不要使用jsonfield。正如Daniel指出的那樣,使用RDBMS提供的方式或MongoDB(內部運行速度更快的BSON)。
由於deterministic of JSON format, 您可以通過使用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並思考是否支持這樣的操作。負面的證據就像上面說的那樣,感覺就像一些黑魔法,好吧。
你不能那樣做。對結構化數據使用普通的數據庫字段,而不是JSON blob。
如果您需要搜索JSON數據,請考慮使用像MongoDB這樣的noSQL數據庫。
如果您使用的是django-jsonfield軟件包,那麼這很簡單。假設你有一個像這樣的模式:
from jsonfield import JSONField
class User(models.Model):
jsonfield = JSONField()
然後與特定用戶名搜索記錄,你可以這樣做:
User.objects.get(jsonfield__contains={'username':username})
明顯!它不與去年(1.0.3)jsonfield工作。 –
那麼,什麼是解決方案。我使用1.0.3 @ VladE.Borovtsov –
嗯,我記得我發現了一些不好的解決辦法,但最終使用此字段停止。使用本地JSON在Postgres的領域很久以前。@ShashankHegde –
如果你使用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)
希望這有助於。
由於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"')
使用'進口json'和'json.dumps(...'了'simplejson'已過時BTW,這將不起作用上的Postgres的舊版本 – andi