2011-08-25 246 views
0

我在看一些代碼,我很好奇這是否是好的做法。Django自定義管理器

 class ToDoManager(models.Manager): 
      def scheduled(self): 
      """ 
      Returns QuerySet of all things to be done. 
      """ 
      return self.filter(...) 


     class ImpStuff(models.Model): 
      ....model definition 

      objects=TodoManager  

我總是看到自定義管理器重寫get_query_set(釋義)方法。這是處理事情的好方法嗎?

回答

1

我以前做過這個。它工作得很好。所以除非你看我的代碼,顯然世界上有兩個人覺得這很有用。

它不是一個替代壓倒一切get_query_set - 它提供了獲取(過濾)的實例額外方式。你可以同時做兩件事(合理的)。

您期待什麼問題?

PS這種方法也用於Pro Django,第274頁及其後面的經理用most_recent()等方法進行擴展。

+0

是的我會期望像Model.objects.scheduled()方法鏈。是對的嗎? – Ben

+0

是!它似乎是正確的地方放東西... –

+0

真棒謝謝安德魯! – Ben

3

使用模型管理器來包裝複雜的ORM查詢是非常乾燥和推薦的。您可以添加參數,這些方法和保存自己很多的代碼:

class ToDoManager(models.Manager): 
     def scheduled(self, start_date, end_date): 
     """ 
     Returns tasks to be done within two dates. 
     """ 
     return self.filter(...) 

然後你只需要做:

todo_tasks = ImpStuff.objects.scheduled(datetime.now(), datetime.datetime.now() + datetime.timedelta(3)) 

經理在很多開源的Django的應用程序,在Github上可用的使用。