Django: извлечение объекта `Q` из`QuerySet`

У меня есть Django QuerySetи я хочу получить Q возразить из этого. (т.е. он содержит тот же запрос, что и этот набор запросов.)

Это возможно? И если да, то как?

3 ответа

Решение

Нет, но вы можете сначала создать объект Q и использовать его; в качестве альтернативы, создайте запрос как dict и передайте его в свой метод фильтра и объект Q.

Это не совсем то, что вы просили, но вы можете извлечь sql из набора запросов, открыв элемент запроса. Например:

x = somequeryset.query

Затем вы можете использовать это для нового объекта набора запросов, чтобы восстановить исходный набор запросов. Это может работать лучше при сохранении таких вещей, как "значения", которые определены для набора запросов. Определенный х легко хранить. Я использовал это в прошлом для сохранения пользовательских запросов / поисков, которые затем выполняются ежедневно, а результаты отправляются пользователю по электронной почте.

Также актуально, если вы хотите, чтобы объект Q был таким, чтобы вы могли восстановить сложный запрос, применив к нему другой объект Q, то есть при условии, что два QuerySets находятся на одной модели, вы можете ИЛИ QuerySets напрямую для того же эффекта. Это стоит попробовать и изучить SQL до и после.

Например:

qs1 = model.objects.filter(...)
print("qs1: {}".format(qs1.query)
qs2 = model.objects.filter(...)
print("qs2: {}".format(qs1.query)
qs = q1 | q2
print("qs: {}".format(qs.query)

Я, конечно, нашел ваш вопрос, потому что по этой причине я хотел получить объект Q из запроса и обнаружил его в Django Users Group:

https://groups.google.com/d/msg/django-users/2BuFFMDL0VI/dIih2WRKAgAJ

что QuerySets можно комбинировать во многом так же, как это делают объекты Q.

Это может или не может быть полезным для вас, в зависимости от причины, по которой вы хотите этот объект Q, конечно.

Другие вопросы по тегам