Est-il possible de filtrer un ensemble de requêtes Django par propriété de modèle?
j'ai une méthode dans mon modèle:
@property
def myproperty(self):
[..]
et maintenant je veux filtrer par cette propriété comme:
MyModel.objects.filter(myproperty=[..])
est-ce possible d'une manière ou d'une autre?
Réponses:
Nan. Les filtres Django fonctionnent au niveau de la base de données, générant du SQL. Pour filtrer en fonction des propriétés Python, vous devez charger l'objet dans Python pour évaluer la propriété - et à ce stade, vous avez déjà fait tout le travail pour le charger.
la source
Je ne comprends peut-être pas votre question initiale, mais il existe un filtre intégré en python.
Mais il est préférable d'utiliser une compréhension de liste :
ou mieux encore, une expression génératrice :
la source
En supprimant la solution de contournement suggérée par @ TheGrimmScientist, vous pouvez créer ces "propriétés sql" en les définissant sur le Manager ou le QuerySet, et réutiliser / chaîner / les composer:
Avec un manager:
Avec un QuerySet:
Voir https://docs.djangoproject.com/en/1.9/topics/db/managers/ pour plus d'informations. Notez que je sors de la documentation et que je n'ai pas testé ce qui précède.
la source
On dirait que l' utilisation de F () avec des annotations sera ma solution à cela.
Il ne va pas filtrer
@property
, car ilF
parle à la base de données avant que les objets ne soient introduits dans Python. Mais toujours en le mettant ici comme réponse car ma raison de vouloir filtrer par propriété était vraiment de vouloir filtrer les objets par le résultat d'une simple arithmétique sur deux champs différents.donc, quelque chose du genre:
plutôt que de définir la propriété comme étant:
puis faire une compréhension de liste sur tous les objets.
la source
J'ai eu le même problème et j'ai développé cette solution simple:
Je sais que ce n'est pas la solution la plus performante, mais peut aider dans des cas simples comme le mien
la source
VEUILLEZ que quelqu'un me corrige, mais je suppose que j'ai trouvé une solution, au moins pour mon propre cas.
Je veux travailler sur tous ces éléments dont les propriétés sont exactement égales à ... peu importe.
Mais j'ai plusieurs modèles, et cette routine devrait fonctionner pour tous les modèles. Et il fait:
Avec ce sous-programme universel, je peux sélectionner tous les éléments qui correspondent exactement à mon dictionnaire de combinaisons «spécifier» (nom de propriété, valeur de propriété).
Le premier paramètre prend un (models.Model),
le second un dictionnaire comme: {"property1": "77", "property2": "12"}
Et cela crée une instruction SQL comme
et renvoie un QuerySet sur ces éléments.
Ceci est une fonction de test:
Et? Qu'est-ce que tu penses?
la source
AttributeError: 'RawQuerySet' object has no attribute 'values'
Je sais que c'est une vieille question, mais pour ceux qui sautent ici, je pense qu'il est utile de lire la question ci-dessous et la réponse relative:
Comment personnaliser le filtre d'administration dans Django 1.4
la source
Il peut également être possible d'utiliser des annotations de jeu de requêtes qui dupliquent la propriété get / set-logic, comme suggéré par exemple par @rattray et @thegrimmscientist , en conjonction avec le
property
. Cela pourrait produire quelque chose qui fonctionne à la fois au niveau Python et au niveau de la base de données.Pas sûr des inconvénients, cependant: voir cette question SO pour un exemple.
la source