django模型filter()和extra()

时间:2010-08-01 18:20:46

标签: python django orm

我遇到查询集的extra()方法的问题。

所以,我用:

检索我的对象
invoices = Invoice.objects.select_related().filter(quantity__gt=0,begin__gte=values['start_day'],end__lte=values['end_day'])

所以它有效,我有我的发票。 之后我使用另一个时间过滤器():

invoices = invoices.filter(max__gte=duration)

它也有效。 但是,之后,由于我的要求,我需要使用extra(),所以我有:

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

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

嗯,它有效但我的发票变量包含更多之前的元素。 这就像没有使用过两个filter()。

如果你知道原因,

感谢。

修改

这是与查询关联的SQL:

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))

1 个答案:

答案 0 :(得分:1)

从查询集对象中转储SQL:

print invoices.query

如果通过查看生成的SQL来查明错误原因并不明显,请更新您的问题并发布SQL供我们查看。

编辑1基于查看SQL

我在质疑SQL中的最后一行(重新格式化):

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

在我看来,你希望用另一组括号中的那两个'折扣'支票形成他们自己的逻辑检查:

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

如果没有明确的分组,OR将独立于其他“折扣”检查进行比较,这将导致它包含您已在上述谓词中排除的内容。