> Modules non standards > Django pour le développement web > Requêtes sur les modèles
Requêtes sur les modèles
On peut explorer l'API base de données en interactif en faisant : manage.py shell. On peut alors importer un modèle : from myApp.models import MyObject
Chaque modèle (classe) MyModel a un manager qu'on appelle en faisant : MyModel.objects. C'est avec ce manager qu'on fait des requêtes.
Requêtes de base :
- attention : les fonctions ci-dessous (query sets) ne font pas de requête dans la base tant que l'on n'accède pas aux objets. C'est seulement à ce moment-là que la base est requêtée.
- MyModel.objects.all() : retourne la liste de tous les objets de la classe présents dans la base.
- MyModel.objects.get(pk = 1) : pour accéder à l'objet de clef primaire 1 :
- on utilise get quand on sait qu'on attend une seule valeur.
- si 0 ou > 1 valeur, ça lève une exception.
- MyModel.objects.filter(myProp = myValue) : retourne la liste des objets qui ont leur propriété myProp à myValue.
- MyModel.objects.exclude(myProp = myValue) : retourne la liste des objets qui n'ont pas leur propriété myProp à myValue (prend l'opposé du critère).
- on peut prendre un tranche d'un queryset, ça retourne un nouveau query set qui n'est pas tout de suite évalué : MyModel.objects.all()[0:5].
- on peut enchaîner les critères : MyModel.objects.filter(myProp1 = myValue1).exclude(myProp2 = myValue2) (objets qui ont à la fois myProp1 à myValue1 et myProp2 différent de myValue2.
- pour forcer l'évaluation une fois qu'on a enchaîné tous les critères : myObj = list(MyModel.objects.filter(myProp1 = myValue1).filter(myProp2 = myValue2))
Arguments de filter :
- .filter(myfield1 = 'abc', myfield2 = 'def') : on peut donner plusieurs critères (il y a un 'and' dans la requête correspondante).
- .filter(myfield__exact = 'pomme') : match exact du champ myfield (nom du champ est mis en minuscules).
- .filter(myfield__iexact = 'pomme') : match exact non sensible à la casse.
- .filter(myfield__contains = 'omm') : contient la chaîne (idem avec icontains, non sensible à la casse). Attention : sous sqlite, __contains se comporte comme __icontains !
- .filter(myfield__startswith = 'pom') : commence par la chaîne (idem avec istartswith, non sensible à la casse). Idem avec __endswith et __iendswith.
- .filter(myfield__in = ['pomme', 'poire']) : in.
- .filter(myfield__gt = 0) : > 0. Idem avec __gte (>= 0), __lt (< 0) et __lte (<= 0).
- .filter(myfield__range = (0, 5)) : utilise un between dans le sql (marche pour nombres, dates et chaînes).
- .filter(myfield__year = 2015) : l'année doit être 2015. Idem avec __month, __day, __week_day, __hour, __minute, __second.
- .filter(myfield__isnull = True) : indique que le champ doit être null (le contraire avec False).
- .filter(myfield__regex = r'^(A|B).*') : commence par 'A' ou 'B' (idem avec __iregex pour expression régulière non sensible à la casse).
pk indique la clef primaire. Les ordres suivants sont équivalents, si la colonne de clef primaire dans la base est id :
- MyModel.objects.get(id__exact = 5).
- MyModel.objects.get(id = 5).
- MyModel.objects.get(pk = 5).
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert