LINUX.ORG.RU

Запрос с использованием Q дает пустое множество

 ,


0

2

Так работает (дает людей, которые одновременно композиторы и исполнители):

models.person.objects.filter(ext_person_category__category__in=['performers']).filter(ext_person_category__category__in=['composers'])
А так нет (дает пустое множество):
models.person.objects.filter(Q(ext_person_category__category__in=['performers'])&Q(ext_person_category__category__in=['composers']))

★★

Ну дык покажи SQL. Как там, .query после всего этого паравозика уже не помню.

anonymous
()

посмотри sql который они генерят. (print something.query)

pi11 ★★★★★
()

Зачем тебе в данном случае Q? Можно просто

models.person.objects.filter(ext_person_category__category__in=['performers'], ext_person_category__category__in=['composers'])
provaton ★★★★★
()
Ответ на: комментарий от anonymous

filter.filter:

"djmuslib_person" INNER JOIN "djmuslib_ext_person_category_people" ON (
    "djmuslib_person"."id" = "djmuslib_ext_person_category_people"."person_id"
)
INNER JOIN "djmuslib_ext_person_category" ON (
    "djmuslib_ext_person_category_people"."ext_person_category_id" = "djmuslib_ext_person_category"."id"
)
INNER JOIN "djmuslib_ext_person_category_people" T4 ON (
    "djmuslib_person"."id" = T4."person_id"
)
INNER JOIN "djmuslib_ext_person_category" T5 ON (
    T4."ext_person_category_id" = T5."id"
)
WHERE (
    "djmuslib_ext_person_category"."category" IN (
        performers
    )
    AND T5."category" IN (
        composers
    )
)
Q&Q:
"djmuslib_person" INNER JOIN "djmuslib_ext_person_category_people" ON (
    "djmuslib_person"."id" = "djmuslib_ext_person_category_people"."person_id"
)
INNER JOIN "djmuslib_ext_person_category" ON (
    "djmuslib_ext_person_category_people"."ext_person_category_id" = "djmuslib_ext_person_category"."id"
)
WHERE (
    "djmuslib_ext_person_category"."category" IN (
        performers
    )
    AND "djmuslib_ext_person_category"."category" IN (
        composers
    )
)

shatsky ★★
() автор топика
Последнее исправление: shatsky (всего исправлений: 1)
Ответ на: комментарий от provaton

Зачем тебе в данном случае Q?

Вопрос почему, а не зачем. Я вот с ходу не вижу почему поведение отличается. AFAIK (по крайней мере в 0.97) filter().filter() внутре преобразовывался в Q()&Q(). Интересно же!

anonymous
()
Ответ на: комментарий от provaton

Нельзя же два одноименных именованных аргумента передавать функции.

SyntaxError: keyword argument repeated
Вообще в данном случае я вполне обхожусь двойным filter, но странное поведение с двойным Q говорит о какой-то проблеме, на которую можно напороться в дальнейшем.

shatsky ★★
() автор топика
Ответ на: комментарий от shatsky

Вона чо, Мыхалыч. Очень забавно. Вообще удивительно что второй фильтр генерит selfjoin. По идее у тебя не должны были работать оба варианта, так как поле не может принимать сразу два значения, но видимо у filter есть специальный костыль на эту тему.

anonymous
()
Ответ на: комментарий от anonymous

не должны были работать оба варианта, так как поле не может принимать сразу два значения, но видимо у filter есть специальный костыль на эту тему

Но это m2m-отношение, вот модель ext_person_category, из которого оно идет:

class ext_person_category(models.Model):
    people=models.ManyToManyField(person)
    category=models.CharField(max_length=255, unique=True)
Смысл запроса - показать людей, у которых на этом m2m висит и категория composers, и категория performers. Разве это делается не так?

shatsky ★★
() автор топика
Ответ на: комментарий от shatsky

Смысл запроса - показать людей, у которых на этом m2m висит и категория composers, и категория performers. Разве это делается не так?

Чорт, надо было сначала попросить тебя руками этот SQL запрос накидать. (Кстати хорошее задание на собеседование). Вообще джанга крутая, если догадалась заджойнить. Лично я бы от нее всегда ждал портянку №2.

anonymous
()

Что такое Q class? И как организовано хранение M2M? Два простых вопроса, которые помогут разобраться в Вашем. И в дополнение, что такое django model names convention или python class naming, чтобы не было стыдно перед коллегами или не получить публичную порку за стилистику, когда руки уже приросли не к тому месту.

commit ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.