Как преобразовать Q-объект Django Queryset в SQL?
<Q(price__lt=160) | Q(publishing_date__year__gte=2016)
<
price < 160 OR YEAR(publishing_date) >= 2016
<
q_obj = Q(price__lt=160) | Q(publishing_date__year__gte=2016)
sql_expression = q_obj_to_sql(q_obj) # Please, recommend if there exists such a thing
<
вы можете сделать следующее:
# is a model expample
class MyModel(models.Model):
price = models.IntegerField()
publishing_date = models.DateField()
...
from django.db.models.sql.query import Query
from django.db.models import Q
from django.db.models.sql.compiler import SQLCompiler
from django.db import connection
# your Q filter
_filter = Q(price__lt=160) | Q(publishing_date__year__gte=2016)
_query = Query(MyModel) # replace "MyModel" with your model
_compiler = SQLCompiler(_query, connection, None)
query_str, args = _filter.resolve_expression(_query).as_sql(_compiler, connection)
# query_str is a string, the result is
# '("my_model"."price" < %s OR "my_model"."publishing_date" >= %s)'
# args is a list, result is
# [160, '2016-01-01']
# for replace arguments in query_str
result = query_str % tuple(args)
# WARNING , don't do this !! Security issue with sql injections.
# result :
# '("my_model"."price" < 160 OR "my_model"."publishing_date" >= 2016-01-01)'