Vous n'êtes pas identifié(e).
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
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
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
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
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
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
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
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