2012-02-18 54 views
1

我只是得到Django Managers我的手,我發現自己正在做這種類型的編程。我期待看看是否有辦法消除明顯的重複..我相信我需要定義使用get_query_set來指代我自己?Django經理或更好的計劃

對我的問題要非常清楚。我重複地不得不通過細分以找出要過濾的行。我認爲有一種更簡單的方法,我只是不確定它是什麼。

感謝您的期待!

--- models.py

class Subdivision(models.Model): 
    objects = SubdivisionManager() 

--- managers.py

class SubdivisionManager(models.Manager): 
    """A generic manager with metros""" 


    def is_metro_sample_eligible(self, subdivision_id): 
     """Are we eligible for sampling taking into account the 90 day windows""" 
     from .models import Subdivision 
     subdivision = Subdivision.objects.get(id=subdivision_id) 
     return True 


    def get_available_subdivisions(self, subdivision_id): 
     """Return all potential subdivisions for a builder in a metro""" 
     from .models import Subdivision 
     subdivision = Subdivision.objects.get(id=subdivision_id) 
     return self.filter(builder_org=subdivision.builder_org, 
          metro=subdivision.metro) 

    def get_available_sampling_subdivisions(self, subdivision_id): 
     """Return Subdivision which are able to participate in metro sampling""" 
     from .models import Subdivision 
     subdivision = Subdivision.objects.get(id=subdivision_id) 
     return self.filter(builder_org=subdivision.builder_org, 
          metro=subdivision.metro, 
          use_sampling = True, 
          use_metro_sampling = True) 
+0

在第一個代碼塊中有'SubdivisionManager',但第二個代碼中有'SubdivisionMetroManager'。這是一個錯字嗎?另外,'is_metro_sample_eligible'似乎缺乏回報。 – 2012-02-18 10:02:51

+0

你是對的!中游修改 - 抱歉回合! – rh0dium 2012-02-18 14:22:38

回答

1

其實,我把is_metro_sample_eligible()Subdivision,因爲每次調用需要訪問一個實例。

class Subdivision(models.Model): 
    def is_metro_sample_eligible(self): 
     """Are we eligible for sampling taking into account the 90 day windows""" 
     #TODO do something useful here and return true or false 
     return True 

然後我想無論是移動get_available_subdivisions()get_available_sampling_subdivisions()到您的builder_org模型

from .models import Subdivision 

class BuilderOrg(models.Model): 
    #whatever you have goes here 
    def get_available_subdivisions(self, metro): 
     """Return all potential subdivisions for a builder in a metro""" 
     return Subdivision.objects.filter(builder_org=self, 
              metro=metro) 

    def get_available_sampling_subdivisions(self, metro): 
     """Return Subdivision which are able to participate in metro sampling""" 
     return Subdivision.objects.filter(builder_org=self, 
              metro=metro, 
              use_sampling = True, 
              use_metro_sampling = True) 

或離開它的經理,和簽名修改到get_available_subdivisions(self, builder_org, metro)

理由 - 我可以想象需要打電話get_available_subdivisions(),但實際上並沒有Subdivision已經記住 - 顯然重要的信息是建設者組織和地鐵。

+0

這很有趣。我完全同意你的觀點,並且已經這樣做了。雖然我理解你的第二和第三種方法的理由,從邏輯上講,我會考慮爲細分查詢細分模型。這促使我想出了一種方法來把這個變成一個經理。理想情況下,這將是一個有點動態的經理。關於如何做到這一點有一些想法(http://www.djangosnippets.org/snippets/734/),但我不確定它們在這裏適用。再次感謝! – rh0dium 2012-02-18 07:13:08

+0

我想我更傾向於改變對'get_available_subdivisions'和方法簽名的'get_available_sampling_subdivisions'-這樣你仍然可以返回模型實例模型類,但你必須比傳遞一個'Subdivision'實例更大的靈活性。 – 2012-02-18 16:03:49