2010-08-01 5 views
1

J'ai un problème avec la méthode extra() de queryset.Modèles django filter() et extra()

, je récupérer mes objets avec:

invoices = Invoice.objects.select_related().filter(quantity__gt=0,begin__gte=values['start_day'],end__lte=values['end_day']) 

Il fonctionne, j'ai mes factures. Après j'utiliser un autre filtre temporel():

invoices = invoices.filter(max__gte=duration) 

Il fonctionne aussi. Mais, après, je dois utiliser() supplémentaire en raison de ma demande, je dois donc que:

cond = 'discount="YES" AND priceeuro*(%d%%fixe)<=%d' 

invoices = invoices.extra(where=[cond],params=[duration,price]) 

Eh bien, cela fonctionne, mais ma variable factures contient plusieurs éléments qui avant. C'est comme si les deux filtres() n'étaient pas utilisés. Si vous savez pourquoi,

merci.

EDIT:

Ceci est le SQL associé à la requête:

WHERE 
("invoice"."product_id" IN (
    SELECT U0."id" 
    FROM "product" U0 
    WHERE U0."accommodation_id" IN (
     SELECT U0."id" 
     FROM "accommodation" U0 
     WHERE U0."resort_id" IN (
      SELECT U0."id" 
      FROM "resort" U0 
      WHERE U0."area_id" IN (
       SELECT U0."id" 
       FROM "area" U0 
       WHERE U0."country_id" = 9 
)))) 
AND "invoice"."quantity" > 0 
AND "invoice"."end" <= 2010-12-31 
AND "invoice"."begin" >= 2010-12-01 
AND fixe % 7 = 0 
AND (discount="YES" AND pricediscountincludedeuro*(7% fixe)<=250)OR(discount="NO" AND  priceeuro*(7% fixe)<=250)) 

Répondre

1

Dump SQL à partir de l'ensemble d'objets de requête:

print invoices.query 

Si la cause de votre bug n'est pas évident en regardant le SQL généré, mettez à jour votre question et postez le SQL pour que nous puissions le voir.

EDIT 1 sur la base de voir le SQL

Je doute la dernière ligne dans votre SQL (reformatée):

... 
AND (discount="YES" AND pricediscountincludedeuro*(7% fixe)<=250) 
OR (discount="NO" AND priceeuro*(7% fixe)<=250) 
) 

Il me semble que vous voulez que ces deux chèques « discount » enveloppées dans un autre ensemble de parenthèses pour former leur propre vérification logique:

... 
AND (
    (discount="YES" AND pricediscountincludedeuro*(7% fixe)<=250) 
    OR 
    (discount="NO" AND priceeuro*(7% fixe)<=250) 
) 
) 

Sans ce regroupement explicite, l'OR est va être comparé indépendamment de l'autre chèque 'discount' et cela l'amènera à inclure des choses que vous avez déjà exclues dans les prédicats ci-dessus.