2017-10-08 16 views
0

問題:今Djangoのモデルの外部キーフィルタ

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

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

iは

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

どのように私はそれを達成しない各ドライバPREFETCHEDのための唯一の最後のイベントを必要とされ、キャッシュ: 私は2つのDjangoのモデルがありますか? のようなものとして関係を制限する方法があります:

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を定義すると、ドライバモデルの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' –

関連する問題