Django-fr

Forum

#1 01-03-2011 20:28:45

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

comment faire cette requête avec D jango

Bonjour,

J'aimerai faire cette requête en django mais il me dit que je dois inclure
la clé primaire dans la requête.
select count(*) from todo_todo where doable_now=1 and project_id=1

Si je fais
select id, count(*) from todo_todo where doable_now=1 and project_id=1
Je n'obtiens pas le résultat escompté.

Comment dois-je faire ?

Merci
Joel

Hors ligne

#2 01-03-2011 21:48:07

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : comment faire cette requête avec D jango

Salut,

Dans Django, à la base tu n'est pas censé générer toi même de requête SQL sauf
pour certains cas. Tu es censé passer par l'interface de requêtes (queryset)
des modèles de données de ton application.

Alors par quel biais essaye tu d'éxécuter ta requête depuis ton application
Django ? Un bout de de code explicite sera plus que le bienvenu.

Hors ligne

#3 01-03-2011 21:57:39

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

Re : comment faire cette requête avec D jango

Salut,

J'ai essayé
q = todo.objects.annotate(Count('id'))
print q.count()
qui fonctionne, mais je n'ai pas trouvé comment ajouter d'autre critères tel
que : project_id=1

Je me suis donc tourné vers le raw sql avec le code suivant.
todo_items = todo.objects.raw( 'select count(*) from todo_todo where
doable_now=1 and project_id=1' )
qui me dit que je dois inclure la clé primaire dans ma requête...

Cordialement,
Joël



Le 1 mars 2011 21:48, David THENON <david.thenon _AT_ wanadoo.fr> a écrit :

> Salut,
>
> Dans Django, à la base tu n'est pas censé générer toi même de requête SQL
> sauf
> pour certains cas. Tu es censé passer par l'interface de requêtes
> (queryset)
> des modèles de données de ton application.
>
> Alors par quel biais essaye tu d'éxécuter ta requête depuis ton application
> Django ? Un bout de de code explicite sera plus que le bienvenu.
>
> --
> Cordialement,
> David THENON.
>
> Le mardi 01 mars 2011 20:28:45, Joel Quinet a écrit :
> > Bonjour,
> >
> > J'aimerai faire cette requête en django mais il me dit que je dois
> inclure
> > la clé primaire dans la requête.
> > select count(*) from todo_todo where doable_now=1 and project_id=1
> >
> > Si je fais
> > select id, count(*) from todo_todo where doable_now=1 and project_id=1
> > Je n'obtiens pas le résultat escompté.
> >
> > Comment dois-je faire ?
> >
> > Merci
> > Joel
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#4 01-03-2011 22:24:31

werefr0g
Membre
Inscription : 09-09-2010
Messages : 23

Re : comment faire cette requête avec D jango

Bonsoir,

Project.objects.get(id=1).todo_set.filter(doable_now=1).count()

ou, si doable_now est un booleen :

Project.objects.get(id=1).todo_set.filter(doable_now=True).count()

?

Hors ligne

#5 01-03-2011 22:26:02

Jonathan Leroy - Inikup
Membre
Lieu : Nîmes, france
Inscription : 11-08-2010
Messages : 27
Site Web

Re : comment faire cette requête avec D jango

Le 01/03/11 21:57, Joel Quinet a écrit :
> Salut,

Salut,

> J'ai essayé
> q = todo.objects.annotate(Count('id'))
> print q.count()
> qui fonctionne, mais je n'ai pas trouvé comment ajouter d'autre critères
> tel que : project_id=1
>
> Je me suis donc tourné vers le raw sql avec le code suivant.
> todo_items = todo.objects.raw( 'select count(*) from todo_todo where
> doable_now=1 and project_id=1' )
> qui me dit que je dois inclure la clé primaire dans ma requête...

En supposant de dans ton model "todo" le champs "project" soit une
ForeignKey:

q = todo.objects.filter(doable_now=True, project=project)

print len(q)

La variable "project" doit être une instance du model vers lequel
renvoie la ForeignKey:

project = Project.objects.get(pk=1)

Le raw() devrait être utilisé qu'en dernier recours, lorsque l'ORM
Django en permet pas d'effectuer la requête kivabien (assez rare).

Hors ligne

#6 01-03-2011 22:35:27

Joel Quinet
Membre
Inscription : 11-08-2010
Messages : 21

Re : comment faire cette requête avec D jango

Oui, c'est un booleen.

Merci beaucoup,
Joel

Le 1 mars 2011 22:24, werefr0g <werefr0g _AT_ yahoo.fr> a écrit :

>  Bonsoir,
>
> Project.objects.get(id=1).todo_set.filter(doable_now=1).count()
>
> ou, si doable_now est un booleen :
>
> Project.objects.get(id=1).todo_set.filter(doable_now=True).count()
>
> ?
>
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#7 01-03-2011 22:39:42

werefr0g
Membre
Inscription : 09-09-2010
Messages : 23

Re : comment faire cette requête avec D jango

Re,

La ligne suivante, utilisant project__id (avec deux '_')  convient-elle ?

Todo.objects.filter(project__id=1).annotate(Count('id'))

D'après ce que je comprends, la ligne suivant collerai : elle gère le
cas où l'id de ton projet n'existe pas et passe directement au décompte
du nombre de Todo.

Todo.objects.filter(project__id=1).filter(doable_now=True).count()

Hors ligne

#8 01-03-2011 23:59:42

Jonathan Leroy - Inikup
Membre
Lieu : Nîmes, france
Inscription : 11-08-2010
Messages : 27
Site Web

Re : comment faire cette requête avec D jango

Le 01/03/11 22:39, werefr0g a écrit :
> Re,
>
> La ligne suivante, utilisant project__id (avec deux '_') convient-elle ?
>
> Todo.objects.filter(project__id=1).annotate(Count('id'))

Oui, aussi.
Mais pourquoi utiliser annoatate() ? count() fait ça directement:

Todo.objects.filter(project__id=1).count()

> D'après ce que je comprends, la ligne suivant collerai : elle gère le
> cas où l'id de ton projet n'existe pas et passe directement au décompte
> du nombre de Todo.
>
> Todo.objects.filter(project__id=1).filter(doable_now=True).count()

Il n'est pas nécessaire de d'utiliser filter() par argument, il suffit
de séparer les champs par des virgules:

Todo.objects.filter(project__id=1, doable_now=True).count()

Hors ligne

Pied de page des forums