comment écrire une requête pour obtenir la valeur de recherche dans un champ json dans django
J'ai un champ json dans ma base de données qui est comme
jsonfield = {'username':'chingo','reputation':'5'}
comment puis-je écrire une requête afin que je puisse déterminer si un nom d'utilisateur existe. quelque chose comme
username = 'chingo'
query = User.objects.get(jsonfield['username']=username)
Je sais que la requête ci-dessus est un mal, mais je voulais savoir si il existe un moyen d'y accéder?
source d'informationauteur shanks
Vous devez vous connecter pour publier un commentaire.
Cette utilisation est quelque peu anti-modèle. Aussi, sa mise en œuvre ne va pas avoir une performance régulière, et peut-être est sujette à erreur.
N'utilisez pas jsonfield lorsque vous avez besoin de regarder à travers les champs. Utiliser le chemin le SGBD fournit ou MongoDB(en interne qui fonctionne plus rapidement BFILS), comme Daniel l'a souligné.
En raison de la déterministe du format JSON
vous pourriez obtenir en utilisant
contains
(regex
a problème quand il s'agit w/plusieurs'\'
et plus encore), je ne pense pas que c'est bien d'utiliserusername
de cette façon, afin de l'utilisername
à la place:Il fonctionne tant que
simplejson
ici)name
etvalue
ne sont pas trop spécial (je ne sais pas tout bord-cas jusqu'à présent, peut-être quelqu'un pourrait-il remarquer)En fait, je travaille sur un modifiable jsonfield et la réflexion sur l'opportunité de soutenir de telles opérations. La preuve négative est comme dit ci-dessus, il se sent comme une noire-magie, bien.
Si vous utilisez django-jsonfield paquet, alors, c'est simple. Disons que vous avez un modèle comme celui-ci:
Ensuite à la recherche pour les enregistrements avec un nom d'utilisateuril vous suffit de faire ceci:
Depuis Django 1.9, vous avez été en mesure d'utiliser PostgreSQL natif JSONField. Cela rend la recherche JSON très simple. Dans votre exemple, cette requête travail:
Si vous avez une ancienne version de Django, ou si vous utilisez Django JSONField bibliothèque pour la compatibilité avec MySQL ou quelque chose de similaire, vous pouvez toujours effectuer votre requête.
Dans la dernière situation,
jsonfield
sera stockée dans un champ de texte et mappé à un dict lors de sa mise en Django. Dans la base de données, vos données seront stockées comme cePar conséquent, vous pouvez simplement rechercher dans le texte. Votre requête dans cette siutation serait:
Vous ne pouvez pas le faire. L'utilisation normale de la base de données des champs pour les données structurées, non JSON gouttes.
Si vous avez besoin de recherche sur les données JSON, envisager l'utilisation d'une base de données noSQL comme MongoDB.
Si vous utilisez PostgreSQL, vous pouvez utiliser sql brut pour résoudre le problème.
où
you_table
est le nom de la table dans votre base de données.Toutes les méthodes lorsque vous travaillez avec JSON comme avec texte en clair - à la recherche comme une très mauvaise manière.
Donc, aussi, je pense que vous avez besoin d'un meilleur schéma de base de données.
Ici est la façon que j'ai trouvé qui permettra de résoudre votre problème:
Espère que cette aide.