我有一个类似的模型
class model(models.Model):
order_created_time = models.DateTimeField(blank=False, null=False)
我有一个比较日期时间的django查询-
filters = {'order_created_on__gte':'2018-10-10'}
queryset = model.objects.filter(**filters)
query = str(queryset.query)
它将创建一个查询-选择...其中订单创建日期〉= 2018-10-10 00:00:00
当在db上触发时,它给出一个错误-在“00”处或附近的语法错误。
如果我在数据库中手动启动相同的查询,将日期替换为“2018-10-10”,它将工作。
现在我实际上尝试了以下方法,但是所有查询在db查询中给予相同的文本
filters = {'order_created_on__gte':datetime(2018-10-10)}
filters = {'order_created_on__year__gte':2018, 'order_created_on__month__gte':10, 'order_created_on__day__gte':10}
型
我也试着把它做成这样的字符串-
filters['order_created_on__gte'] = "'{0}'".format(filters['order_created_on__gte'])
其声明为无效格式,预期为2018-10-10 00:00[:00][TZ]
还使用了范围过滤器,所有上述插入此文本在最终查询-
where order_created_on >= 2018-10-10 00:00:00
更新时区也没有任何效果,而只是从查询中删除了+5:30。
4条答案
按热度按时间t3psigkw1#
Django实际上并不使用
str(queryset.query)
的结果来查询数据库,原因很简单:数据库接受参数化查询,所以Django从来不把参数放在查询中,它把查询字符串和参数列表分别发送到数据库,数据库会决定如何处理。
为了简单起见,它所做的只是在查询中调用
__str__()
时进行普通字符串替换,而不是在内部使用,因此纯粹是为了方便用户。当然,当一个日期被插入到这样的格式字符串中时,它周围没有引号,当你试图复制粘贴查询并在数据库中使用它时,这会导致错误。他们没有费心去实现这一点,因为类型太多,好处太少。
虽然您可以创建自己的函数来自动引用参数,甚至monkeypatch queryset类,以便
__str__()
方法返回您需要的内容,但我认为如果您经常这样做,django-debug-toolbar是最好的方法。8hhllhi22#
最后在尝试了所有的过滤器后,通过用正则表达式替换查询文本来解决它。
jdg4fx2g3#
厌倦了使用正则表达式来替换查询,使用了这种方法。只需将过滤器与选项或“ORM”或“RAW”放在一起。如果是原始的,则它将构造“where”查询。您也可以在其中添加其他过滤器。
通过这个,你可以得到ORM过滤器和RAW查询过滤器。我所面临的问题是日期时间没有被作为字符串插入,所以这里我只是做了一个字符串的所有where条件。
您需要手动输入查询并将其存储在数据库中或存储在如下常量中-
您还可以在其中添加order by,但需要显式地将其传递到查询中,而不是在过滤器中添加,因此它是这样的-
型
如果您需要添加其他显式过滤器,您可以这样做
1cklez4t4#
您可以使用以下公式生成查询:-