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, конечно.