1,django中ORM只能通過ForeignKey定義多對一的關系,不能顯式地定義一對多關系;
特別是讀代碼時,第一個類定義完全沒法提示一對多的關系。我必須要看到了第二個類定義,才能搞明白兩個模型之間的關系。真希望有一種顯式說明關系的辦法,降低讀代碼時的認知負擔。
2.聚合:
django進行聚合查詢的時候,orm在表達對GROUP BY上表示很無奈,只有annotate()和aggressive()這兩種查詢方法,但是對於一些復雜的查詢就很魔幻。
3.查詢:
Django在通過一些方法來實現,絕大多數返回的是Django自定義的queryset的迭代器,然而python會對這些作懶惰求值,然而這些方法並不會真正的操作數據庫,
即通過命名方式來控制查詢行為。我看過有的ORM是用lambda的形式來表達WHERE條件,還有的會做一個類似於contains()的方法,都要比Django ORM的方式好看。如果是跨表查詢,Django的方式就更丑了:
Customer.objects.filter(company__name__contains="xxx")
無限的雙下划線啊……
總的來說,Django ORM在實現基礎的數據庫操作方面沒問題。但如果需要構建復雜的SQL語句,與其在Django ORM里繞來繞去,還不如直接用原始的SQL語句。這個是我最強烈的一個感受。