Filtres et requêtes avancés
Filtres et requêtes avancés
Cette page décrit les opérateurs de filtre de frappe.get_list, frappe.get_all et de l'API REST. Elle détaille l'opérateur between sur les dates et les heures.
Les exemples utilisent les champs standard de Facture de vente (Sales Invoice). Les noms de clients sont fictifs.
Format d'un filtre
Un filtre est une liste [champ, opérateur, valeur]. Plusieurs filtres se combinent par ET. Pour un champ d'une table enfant, ajoutez le type de document en premier : [doctype, champ, opérateur, valeur].
frappe.get_list(
"Sales Invoice",
filters=[
["posting_date", "between", ["2026-04-01", "2026-06-30"]],
["status", "=", "Paid"],
["Sales Invoice Item", "item_code", "=", "CHAISE-001"],
],
fields=["name", "customer", "grand_total", "posting_date"],
)
Opérateurs
| Opérateur | Rôle | Exemple |
|---|---|---|
=, != | Égal, différent | ["status", "!=", "Cancelled"] |
>, >=, <, <= | Comparaison | ["grand_total", ">=", 1000] |
like, not like | Contient un motif (% = n'importe quels caractères) | ["customer", "like", "%Maison%"] |
in, not in | Dans une liste, hors d'une liste | ["status", "in", ["Paid", "Partly Paid"]] |
between | Entre deux bornes, bornes incluses | ["grand_total", "between", [100, 500]] |
is | Renseigné ou vide | ["due_date", "is", "set"], ["due_date", "is", "not set"] |
timespan | Période relative | ["posting_date", "timespan", "this month"] |
descendants of, ancestors of | Descendants ou ancêtres dans un arbre | ["territory", "descendants of", "France"] |
not descendants of, not ancestors of, descendants of (inclusive) | Variantes des opérateurs d'arbre | ["item_group", "descendants of (inclusive)", "Mobilier"] |
regex | Expression régulière | ["customer", "regex", "^SARL"] |
L'opérateur between
between reçoit une liste de deux bornes. Il fonctionne sur les champs nombre, date et date et heure.
Sur un champ Date
Les bornes sont des dates AAAA-MM-JJ. Une valeur date et heure est ramenée à sa date.
# Factures du deuxième trimestre 2026
frappe.get_list(
"Sales Invoice",
filters=[["posting_date", "between", ["2026-04-01", "2026-06-30"]]],
)
Sur un champ Date et heure
Ceci s'applique aux champs Date et heure et aux champs creation et modified.
- Une borne date seule (
"2026-08-01") couvre la journée : la borne basse devient00:00:00, la borne haute23:59:59.999999. - Une borne avec une heure, séparée par une espace (
"2026-08-01 08:00:00"), garde son heure.
# Factures créées le 1er août 2026 entre 8 h et 18 h
frappe.get_list(
"Sales Invoice",
filters=[["creation", "between", ["2026-08-01 08:00:00", "2026-08-01 18:00:00"]]],
)
T du format ISO 8601 ("2026-08-01T08:00:00"). Dodock lit alors la borne comme une date seule et ignore l'heure. Le filtre couvre la journée entière.Exemple complet : ventes d'un mois
from collections import defaultdict
import frappe
factures = frappe.get_all(
"Sales Invoice",
filters=[
["posting_date", "between", ["2026-08-01", "2026-08-31"]],
["docstatus", "=", 1],
],
fields=["name", "customer", "grand_total", "posting_date"],
order_by="posting_date asc",
)
total_ventes = sum(f.grand_total for f in factures)
print(f"Nombre de factures : {len(factures)}")
print(f"Total des ventes : {total_ventes} €")
ventes_par_client = defaultdict(float)
for facture in factures:
ventes_par_client[facture.customer] += facture.grand_total
for client, montant in ventes_par_client.items():
print(f"- {client} : {montant} €")
Pour faire la somme dans la base au lieu de Python, utilisez fields=["customer", {"SUM": "grand_total", "as": "total"}] et group_by="customer".
Dépannage
Si un filtre between ne renvoie pas les lignes attendues :
- Vérifiez le format des dates :
AAAA-MM-JJ, etAAAA-MM-JJ HH:MM:SSavec une espace pour une heure. - Vérifiez l'ordre des bornes : la première borne doit être la plus petite.
- Vérifiez le type du champ dans le type de document.
- Avec
frappe.get_list, vérifiez les autorisations de l'utilisateur.frappe.get_allne les contrôle pas.