2013-01-23 71 views
0

我寫了一個抽象基類,它將我的一些表的常用字段組合在一起。我希望能夠使用管理器以相同的方式查詢所有這些字段。的這個自定義管理器 - 抽象基類的查詢

class TemporalModel(models.Model): 
    objects = models.Manager() 
    today = TodayManager() 

    time = models.DateTimeField() 

    class Meta: 
     abstract = True 
     get_latest_by = 'time' 

一個簡單的例子,如上所示,是能夠今天以查詢的條目TemporalModel的亞類(其中所有具有「時間」字段)。

我這樣寫了一個經理:

class TodayManager(models.Manager): 
    def get_query_set(self): 
     now = timezone.now() 
     today = datetime(now.year, now.month, now.day, tzinfo=now.tzinfo) 
     tomorrow = today + timedelta(days=1) 

     qs = models.Manager.get_query_set(self).filter(time >= today) 
     qs = qs.filter(time < tomorrow) 

     return qs 

嘗試使用這種失敗與NameError(未規定的時間)。我認爲這與this question中的原因相同 - 該字段不在抽象類中,而是在子類上。

不過,我從來沒有真正的抽象類調用此。如果我有類似如下:

class SomeTemporalThing(TemporalModel): 
    pass # I'm a real table! :) 

那麼我希望能夠調用,例如,SomeTemporalThing.today.all(),並有Django的對執行時間> = TODAY /時間<明天查找子表。

是否有可能實現這一目標,而不經理定義移動到子類(這會導致重複)?

我的custom manager documentation的讀數表明,它應該是可能的,但我難倒如何。

回答

1

你在做什麼應該是可能的。您所看到的錯誤是不相關的Manager對象的繼承,而是一個不正確的規範對QuerySetfilter()功能。

而不是

qs = models.Manager.get_query_set(self).filter(time >= today) 

應該

qs = models.Manager.get_query_set(self).filter(time_gte=today) 

這同樣適用於你的time < tomorrow濾波器參數。

QuerySet API documentation

+0

這是我接受你的答案和我是白癡這個事實的部分。隊友的歡呼聲 :) – sapi