什么时候应该在Django中使用objects.raw()?

时间:2013-06-29 13:23:41

标签: python database django

我对Python很陌生,我已经看到了两者

Entries.objects.raw("SELECT * FROM register_entries")

Entries.objects.filter()

执行相同的查询。

在哪种情况下最好使用其中一种?

2 个答案:

答案 0 :(得分:4)

这取决于您使用的数据库后端。第一个假设您有一个基于SQL的数据库引擎。这并非总是如此。相反,第二个将在任何情况下工作(如果后端是为其设计的)。例如,几年前有一个设计的LDAP后端,但LDAP查询根本不使用SQL语言。

在所有情况下,我建议您使用第二个。如果您想制作可重复使用的长期代码,这是更好的方法。

还有其他想法更喜欢第二个到第一个

  • 避免可能的SQL注入;
  • 无需了解数据库设计(表名,字段名称);
  • 通用代码优于特定代码;
  • 而且,它更短......

但是,当您进行特定操作(调用特定后端的功能)时,有时您将不得不使用第一个,但尽可能地避免它们

简而言之,请使用第二个!!!

答案 1 :(得分:1)

来自django documentation

  

当模型查询API不够用时,您可以回退到编写原始SQL

对于所有方面,django queryset api为您提供了许多自定义查询的选项。但在某些情况下,您需要使用非常具体的查询,其中django api变得不足。但在使用原始SQL之前,最好阅读所有Queryset Api文档并了解有关django queryset api的所有内容。