flask sqlalchemy query avec le mot clé comme variable
Disons que j'ai un modèle comme celui-ci:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
hometown = db.Column(db.String(140))
university = db.Column(db.String(140))
Pour obtenir une liste des utilisateurs à partir de New York, voici ma requête:
User.query.filter_by(hometown='New York').all()
Pour obtenir une liste des utilisateurs qui vont à l'USC, c'est ma requête:
User.query.filter_by(university='USC').all()
Et pour obtenir une liste des utilisateurs de New York, et qui vont à l'USC, c'est ma requête:
User.query.filter_by(hometown='New York').filter_by(university='USC').all()
Maintenant, je voudrais générer dynamiquement ces requêtes basées sur la valeur d'une variable.
Par exemple, ma variable pourrait ressembler à ceci:
{'hometown': 'New York'}
Ou comme ceci:
{'university': 'USC'}
... Ou même comme ceci:
[{'hometown': 'New York'}, {'university': 'USC'}]
Pouvez-vous m'aider à écrire une fonction qui prend un dictionnaire (ou une liste de dictionnaires) en entrée, et ensuite de façon dynamique s'appuie le bon sqlalchemy requête?
Si j'essaie d'utiliser une variable pour le mot-clé, j'obtiens cette erreur:
key = 'university'
User.query.filter_by(key='USC').all()
InvalidRequestError: Entity '<class 'User'>' has no property 'key'
Deuxièmement, je ne suis pas sûr de la façon de la chaîne de multiples filter_by ensemble des expressions de manière dynamique.
Je peux explicitement, appeler un filter_by expression, mais comment puis-je enchaîner plusieurs ensemble en fonction d'une variable?
Espère que cela a plus de sens.
Merci!
source d'informationauteur SeanPlusPlus
Vous devez vous connecter pour publier un commentaire.
SQLAlchemy de
filter_by
prend les arguments mots-clefs:En d'autres termes, la fonction va vous permettre de donner n'importe quel mot clé de paramètre. C'est pourquoi vous pouvez utiliser n'importe quel mot clé que vous voulez dans votre code: SQLAlchemy fondamentalement voit les arguments d'un dictionnaire des valeurs. Voir la Tutoriel Python pour plus d'informations sur le mot-clé arguments.
Donc, qui permet aux développeurs de SQLAlchemy à recevoir l'arbitraire d'un tas d'arguments mots-clefs en forme de dictionnaire. Mais vous vous demandez pour le contraire: pouvez-vous passer l'arbitraire d'un tas de mots clés les arguments d'une fonction?
Il s'avère qu'en Python, vous pouvez, à l'aide d'une fonctionnalité appelée le déballage. Il suffit de créer le dictionnaire d'arguments et de le passer à la fonction précédée par
**
comme suit:filter_by(**request.args)
ne fonctionne pas bien si vous avez des modèles de non-paramètres de la requête, commepage
pour la pagination, sinon vous aurez des erreurs de ce type:Je utiliser quelque chose comme cela qui ignore les paramètres de la requête et non dans le modèle:
Considérant un modèle avec une colonne appelée
valid
quelque chose comme ceci:invalid
sera ignorée, etpage
est disponible pour la pagination et le meilleur de tous, le SQL suivant sera généré:WHERE mymodel.valid in (1,2)
(obtenir l'extrait ci-dessus gratuitement, si vous utilisez cette standard-module d'économie d')