django модели filter () и extra () - PullRequest
       1

django модели filter () и extra ()

1 голос
/ 01 августа 2010

У меня проблема с методом 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])

Ну, это работает, но моя переменная invoices содержит больше элементов, чем раньше.Как будто два фильтра () не использовались.

Если вы знаете, почему,

спасибо.

РЕДАКТИРОВАТЬ:

Это 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 Ответ

1 голос
/ 01 августа 2010

Дамп 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 будет сравниваться независимо от другой проверки «скидка», и это приведет к тому, что в нее будут включены вещи, которые вы уже исключили из вышеупомянутых предикатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...