2017-10-08 106 views
0

問題: 我有兩個Django模型:Django的模型外鍵過濾

class Driver(models.Model): 
    event = models.ForeignKey('Event') 
    last_event = ???? 
    ... 
    ... 

class Event(models.Model): 
    date = models.IntegerField() 

現在我只需要爲每個驅動程序PREFETCHED最後一個事件和緩存

d = Driver.objects.prefetch_related('last_event???') 

我如何實現的呢? 有什麼辦法來限制的關係,就像這樣:

last_event = models.ForeaignKey('Event', filter = ...???) 
+0

一個驅動器只能有一個用一個ForeignKey事件。所以你要找的是'事件'。或者你可能需要一個多對多的關係。 –

回答

0

好吧,我已經解決了問題通過添加:

def get_current_tour(self): 
     ret = None 
     self._my_relations.create_dict_path('current_tour') 
     if not self._my_relations['current_tour']: 
      try: 
      self._my_relations['current_tour'] = \ 
       DriverTour.objects.filter(start_date__lte=int(time.time()), end_date__gte=int(time.time()), driver=self.id).order_by('-id').all()[0] 
      ret = self._my_relations['current_tour'] 
     except Exception: 
      self._my_relations['current_tour'] = None 
      ret = None 
     else: 
      ret = self._my_relations['current_tour'] 
     return ret 

    def set_current_tour(self, args): 
     self._my_relations['current_tour'] = args[0] 

    current_tour = property(fget=get_current_tour, fset=set_current_tour) 

所以現在它的表現,因爲我計劃:像緩存性能

0

爲了避免圈子的依賴,你可以定義驅動程序的所有外鍵在事件的模型,也因司機可以有很多事件。

class Event(models.Model): 
    driver = models.ForeignKey(Driver, related_name='events') 
    date = models.IntegerField() 
    created_at = models.DateTimeField(auto_now_add=True) 
    objects = EventManager() 

,然後定義在事件管理器中的last_event屬性,像這樣:

class EventManager(models.Manager): 
    @property 
    def last_event(self, driver): 
     return self.filter(driver=driver).lastest('created_at') 

然後你就可以Event.objects.last_event調用它(駕駛員)

如果你想使用driver.last_event,那麼你可以在Driver模型中定義一個last_event屬性:

class Driver(models.Model): 
    ... 
    @propery 
    def last_event(self): 
     the_last_event = Event.objects.last_event(self) 
     return the_last_event 
+0

不完全是我的意思 它應該是 'd.last_event ..... blablabla' –