Este uso es algo anti-patrón. Además, su implementación no va a tener un rendimiento regular, y quizás es propenso a errores.
Normalmente no use jsonfield cuando necesite buscar campos. Use la forma en que proporciona RDBMS o MongoDB (que opera internamente en BSON más rápido), como señaló Daniel.
Debido a la deterministic of JSON format, que podría lograr mediante el uso de contains
(regex
tiene problema cuando se trata w/múltiples '\'
e incluso más lento), no creo que es bueno utilizar username
de esta manera, por lo que su uso name
lugar:
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))
funciona siempre y cuando
- la jsonfield usando la misma aplicación volcado (la
simplejson
aquí)
name
y value
no son demasiado especial (no sé cualquier borde de esto de los casos hasta el momento, tal vez alguien podría señalarlo)
- sus datos jsonfield no es corrupta (aunque poco probable)
en realidad, yo estoy trabajando en un jsonfield editable y pensando en la posibilidad de apoyar este tipo de operaciones. La prueba negativa es como se dijo anteriormente, se siente como magia negra, bueno.
Use '' json' importación y json.dumps (... '' la simplejson' está en desuso Por cierto esto no va a trabajar en la versión anterior de Postgres – andi