我遇到查询集的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))
答案 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将独立于其他“折扣”检查进行比较,这将导致它包含您已在上述谓词中排除的内容。