簡體   English   中英

Django模型外鍵過濾器

[英]Django model foreign key filter

問題:我有兩個Django模型:

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

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

現在我只需要每個驅動程序的PRELASTCHED和CACHED LAST事件

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

我該如何實現? 有什么辦法可以將關系限制為:

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

為了避免產生圈依賴關系,可以在事件模型中定義驅動程序的所有外鍵,並且由於驅動程序可能具有許多事件。

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)調用它

如果要使用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

我已經通過添加解決了一個問題:

    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)

所以現在它的行為符合我的計划:就像可緩存的屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM