Django-fr

Forum

#1 30-08-2011 11:04:47

sesame
Membre
Inscription : 22-03-2011
Messages : 263

filtrage

Bonjour

Je cherche a faire une recherche par filtrage sur un champ numerique

Exemple

class Material(models.Model):
    name = models.CharField(_('name'), max_length=50)

class propriete(models.Model):
   name = models.ForeignKey(Material, verbose_name=_('name'))   
   val_champ = models.CharField(_('val_champ'), max_length=50) 
   val= models.FloatField(blank=True, null=False) 


je voudrais trouver tous les materiaux dont la valeur du champ "val" est compris
dans l'intervalle [val1, val2]

comment s'y prendre ?

mat = propriete.objects.filter(…..)  ?

Hors ligne

#2 30-08-2011 11:14:21

abki
Membre
Lieu : Paris
Inscription : 11-08-2010
Messages : 49
Site Web

Re : filtrage

2011/8/30 sesame <pat.100 _AT_ hotmail.fr>

> Bonjour
>

Bonjour sesame,



> Je cherche a faire une recherche par filtrage sur un champ numerique
>
> Exemple
>


> class propriete(models.Model):
>   name = models.ForeignKey(Material, verbose_name=_('name'))
>   val_champ = models.CharField(_('val_champ'), max_length=50)
>   val= models.FloatField(blank=True, null=False)
>
>
> je voudrais trouver tous les materiaux dont la valeur du champ "val" est
> compris
>  dans l'intervalle [val1, val2]
>
> comment s'y prendre ?
>
> mat = propriete.objects.filter(…..)  ?


tu es à la recherche des arguments "magiques" de la method filter [1]

cela fonctionne de la façon suivante:

{{ nom_de_l_attribute }}__{{ methode_de_filtrage}}

en paramètre il faut passer la valeur sur laquelle le filtrage a lieu

dans ton cas cela donnerai:

>>> mat = propriete.objects.filter(val__gt=val1, val__ls=val2)

et voilà smile

[1]
https://docs.djangoproject.com/en/dev/ref/models/querysets/#field-lookups

Hors ligne

#3 30-08-2011 12:33:07

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage

mais que devient le  q = request.GET['q'] renvoyé par le submit...

on pars d'un formulaire avec un boutton submit qui envoie la valeur , on teste un encadrement de cette valeur

Hors ligne

#4 30-08-2011 12:39:21

Rémy HUBSCHER
Membre
Inscription : 11-08-2010
Messages : 161

Re : filtrage

Ben il te faut deux valeurs dans ton formulaire avec le min et le max.

Sinon, il faut que tu définisses val1 et val2 en fonction de q avec val1 = q-10 et val2=q+10

Hors ligne

#5 30-08-2011 12:58:12

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage

merci, je vais tester

Hors ligne

#6 30-08-2011 14:27:05

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage

ca marche..encore merci

mais, pourrait on utiliser le propriete.objects.filter() sur les deux champs val et val_champ ?

Hors ligne

#7 31-08-2011 10:05:12

sesame
Membre
Inscription : 22-03-2011
Messages : 263

Re : filtrage

visiblement le double filtrage ne marche pas

voici ma fonction

def search_filter(request):
    errors = []
    try:
       if 'q' in request.GET:
           q = int(request.GET['q'])
           val1 = request.GET['fil']
    except ValueError, error:
       return render_to_response('materiaux/message.html',
                                  locals(),
                                  context_instance=RequestContext(request))
     
    else:
        print(q)
        print(val1)
        mat = UniteProperty.objects.filter(val_champ__icontains =val1)
        mat = UniteProperty.objects.filter(val__gte=q-1, val__lte=q+1 )
           
        return render_to_response('materiaux/search_results_filt.html',
                {'mat'  : mat,
                 'query': val1,
                 'query': q,
                 })

Hors ligne

#8 31-08-2011 11:44:35

SBillion
Membre
Lieu : grenoble
Inscription : 05-08-2011
Messages : 43
Site Web

Re : filtrage

C'est normal, tu assignes une nouvelle valeur à mat en faisant mat =
Pourquoi ne pas tout mettre dans la même requête?

UniteProperty.objects.filter(val_champ__icontains=val1, val__gte=q-1, val__lte=q+1)



Le 31/08/2011 11:05, sesame a écrit :
> visiblement le double filtrage ne marche pas
>
> voici ma fonction
>
> def search_filter(request):
>      errors = []
>      try:
>         if 'q' in request.GET:
>             q = int(request.GET['q'])
>             val1 = request.GET['fil']
>      except ValueError, error:
>         return render_to_response('materiaux/message.html',
>                                    locals(),
>
> context_instance=RequestContext(request))
>
>      else:
>          print(q)
>          print(val1)
>          mat = UniteProperty.objects.filter(val_champ__icontains =val1)
>          mat = UniteProperty.objects.filter(val__gte=q-1, val__lte=q+1 )
>
>          return render_to_response('materiaux/search_results_filt.html',
>                  {'mat'  : mat,
>                   'query': val1,
>                   'query': q,
>                   })
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

Pied de page des forums