Django-fr

Forum

#1 12-05-2012 10:29:51

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

boucle sur queryset

bonjour

lorsque je veux faire une recherche de materiaux dont la valeur min est val_min1, la valeur max est val_max1
je fais

units1 =  UniteProperty2.objects.filter(Q(val_champ__icontains = valT1) & Q(val1__gte=val_min1-2, val1__lte=val_min1+2))
units2 =  UniteProperty2.objects.filter(Q(val_champ__icontains = valT1) & Q(val2__gte=val_max1-2, val2__lte=val_max1+2))
           
units10 = units1 & units2

val1 et val2 etant les valeurs ecrites dans la base suivant le modele
valT1 etant le nom de la propriete   

class UniteProperty2(models.Model):
    name = models.ForeignKey(Material, verbose_name=_('name'))                                   
    nature_unit = models.ForeignKey(Property, verbose_name=_('nature_unit'))                      .
    val_champ = models.CharField(_('val_champ'), max_length=150, choices = PHYSICS_CHOICES)     .
    val1= models.FloatField(blank=True, null=False)                                               
    val2= models.FloatField(blank=True, null=False)

mais comment faire pour rechercher tous les materiaux compris entre val_min1 et val_max1 ?

une boucle entre val_min1 et val_max1 ?
il faudrait que val1 et val2 changent a chaque passage de boucle...

je ne comprend pas..

Hors ligne

#2 13-05-2012 19:03:09

Christophe, Jean-Charles Narbonne
Membre
Inscription : 23-06-2011
Messages : 30

Re : boucle sur queryset

Bonjour,

Ta question est spécifique au métier de ton application et pas évidente à
comprendre.

Je ne comprend pas la relation entre l'unité, la "valeur" des materiaux.
tes noms de variables n'ont pas de sens à mes yeux (les suffixe 1 et 2 en
fin de noms de variable et de classes sont une plaie à la lisibilité du
code. Même si c'est un example.)

pourquoi des -2 et des +2?

pourquoi le lien vers material est dans un champ "name"?

Je ne comprend pas la question.

2012/5/12 sesame <pat.100 _AT_ hotmail.fr>

> bonjour
>
> lorsque je veux faire une recherche de materiaux dont la valeur min est
> val_min1, la valeur max est val_max1
> je fais
>
>  units1 =  UniteProperty2.objects.filter(Q(val_champ__icontains = valT1) &
> Q(val1__gte=val_min1-2, val1__lte=val_min1+2))
>  units2 =  UniteProperty2.objects.filter(Q(val_champ__icontains = valT1) &
> Q(val2__gte=val_max1-2, val2__lte=val_max1+2))
>
>  units10 = units1 & units2
>
> val1 et val2 etant les valeurs ecrites dans la base suivant le modele
> valT1 etant le nom de la propriete
>
> class UniteProperty2(models.Model):
>    name = models.ForeignKey(Material, verbose_name=_('name'))
>
>    nature_unit = models.ForeignKey(Property,
> verbose_name=_('nature_unit'))                      .
>    val_champ = models.CharField(_('val_champ'), max_length=150, choices =
> PHYSICS_CHOICES)     .
>    val1= models.FloatField(blank=True, null=False)
>
>    val2= models.FloatField(blank=True, null=False)
>
> mais comment faire pour rechercher tous les materiaux compris entre
> val_min1 et val_max1 ?
>
> une boucle entre val_min1 et val_max1 ?
> il faudrait que val1 et val2 changent a chaque passage de boucle...
>
> je ne comprend pas..
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#3 14-05-2012 06:36:37

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

Re : boucle sur queryset

bien,
pour un materiau donné (name=models.ForeignKey), de propriete nature_unit (mecanique, ou physique etc) j'ai toutes ses caracterisques enregistrees (essais experimentaux)
par exemple pour la propriete durete vickers (val_champ) j'ai par exemple val1 (valeur min) = 35 val2= 53 (valeur max) (unite GPa)
je fais donc un filtrage min et max sur les intervalles [-2 +2] encadrant valmin1, valmax1  (-2 et +2 choisis arbitrairement)

si valmin encadre la valeur enregistree (val1) dans l'intrevalle -2,+2 le materiau (par exemple Al2O3) est retenu((name = models.ForeignKey(Material, verbose_name=_('name'))       

maintenant si je veux connaitre tous les materiaux pouvant etre retenus dans la plage valmin1, valmax1, le probleme est different

Hors ligne

#4 14-05-2012 07:19:50

Christophe, Jean-Charles Narbonne
Membre
Inscription : 23-06-2011
Messages : 30

Re : boucle sur queryset

Le modèle qu'on a c'est UniteProperty2 pas Material.

Sans trop comprendre ce que tu m'explique, je pense que soit tu n'as pas de
calcul à faire dans la requete et tu peux chainer plus de Q objects soit il
te faut un F object.

https://docs.djangoproject.com/en/dev/topics/db/queries/#query-expressions

Et je maintiens, les numéreaux en fin de variable c'est ma vu,

(
http://www.developpez.com/actu/43571/Quels-sont-les-pires-noms-de-variables-que-vous-avez-deja-vus-Un-developpeur-identifie-les-deux-plus-mauvais-noms-couramment-utilises/)

même si dans ton cas métier value est le terme à utiliser il est souvent
utilisé à tord comme data dans le lien précédent.

Cordialement et toujours sans avoir compris la question. Malgré un Bac S SI
en poche.

2012/5/14 sesame <pat.100 _AT_ hotmail.fr>

> bien,
> pour un materiau donné (name=models.ForeignKey), de propriete nature_unit
> (mecanique, ou physique etc) j'ai toutes ses caracterisques enregistrees
> (essais experimentaux)
> par exemple pour la propriete durete vickers (val_champ) j'ai par exemple
> val1 (valeur min) = 35 val2= 53 (valeur max) (unite GPa)
> je fais donc un filtrage min et max sur les intervalles [-2 +2] encadrant
> valmin1, valmax1  (-2 et +2 choisis arbitrairement)
>
> si valmin encadre la valeur enregistree (val1) dans l'intrevalle -2,+2 le
> materiau (par exemple Al2O3) est retenu((name = models.ForeignKey(Material,
> verbose_name=_('name'))
>
> maintenant si je veux connaitre tous les materiaux pouvant etre retenus
> dans la plage valmin1, valmax1, le probleme est different
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django
>

Hors ligne

#5 14-05-2012 10:46:59

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

Re : boucle sur queryset

voila le test auquel je pense

X1 = arange(val_min1,val_max1, 0.1)
           
                    for inc in range(0,len(X1))[::-1]:
                        units_max =  Essai_Temperature.objects.filter(Q(val_champ__icontains = valT1) & Q(val20__gte= X1[inc]))
         
                    for inc in range(0,len(X1),1):
                        units_min =  Essai_Temperature.objects.filter(Q(val_champ__icontains = valT1) & Q(val10__lte= X1[inc]))

Hors ligne

#6 14-05-2012 10:51:02

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

Re : boucle sur queryset

Qu'est-ce que tu veux récupérer en fait ?

Pourquoi tu ne fais pas directement :

units =
Essai_Temperature.objects.filter(Q(val_champ__icontains = valT1)&
Q(val20__gte= val_min1)&
Q(val20__lte= val_max1)
)



Le 14/05/2012 11:46, sesame a écrit :
> voila le test auquel je pense
>
> X1 = arange(val_min1,val_max1, 0.1)
>
>                      for inc in range(0,len(X1))[::-1]:
>                          units_max =
> Essai_Temperature.objects.filter(Q(val_champ__icontains = valT1)&
> Q(val20__gte= X1[inc]))
>
>                      for inc in range(0,len(X1),1):
>                          units_min =
> Essai_Temperature.objects.filter(Q(val_champ__icontains = valT1)&
> Q(val10__lte= X1[inc]))
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#7 14-05-2012 11:45:13

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

Re : boucle sur queryset

je veux recuperer le nom de tous les materiaux dans l'intervalle [val_min1, val_max1]

et non ceux situes aux bornes de l'intervalle

Hors ligne

#8 14-05-2012 12:13:05

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

Re : boucle sur queryset

L'intervalle c'est :

val_min1 <= X <= val_max1

Soit

X >= val_min1
X <= val_max1

gte signifie : >=
lte signifie : <=

Donc la requête :

units =
Essai_Temperature.objects.filter(val_champ__icontains = valT1).filter(val20__gte= val_min1).filter(val20_lte=val_max1)

CQFD

Rémy

Le 14/05/2012 12:45, sesame a écrit :
> je veux recuperer le nom de tous les materiaux dans l'intervalle [val_min1,
> val_max1]
>
> et non ceux situes aux bornes de l'intervalle
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#9 14-05-2012 13:17:09

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

Re : boucle sur queryset

val10 et val20 sont les donnees enregistrees (valeurs min et max)
il manquerait un test avec val10 ?


units1 =
Essai_Temperature.objects.filter(Q(val_champ__icontains = valT1) &
Q(val20__gte= val_min1)&
Q(val20__lte= val_max1)
)

units2 =
Essai_Temperature.objects.filter(Q(val_champ__icontains = valT1) &
Q(val10__gte= val_min1) &
Q(val10__lte= val_max1)
)

unit_1_2 = units1 & units2

Hors ligne

Pied de page des forums