简体   繁体   English

Django模型外键过滤器

[英]Django model foreign key filter

The problem: I have two django models: 问题:我有两个Django模型:

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

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

Now i need only LAST event for each driver PREFETCHED and CACHED 现在我只需要每个驱动程序的PRELASTCHED和CACHED LAST事件

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

How do i achieve it? 我该如何实现? Is there any way to limit relation as something like: 有什么办法可以将关系限制为:

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

To avoid of making circle dependencies, you can define all the foreign key of driver in the model of Event, and also due to a driver could have many events. 为了避免产生圈依赖关系,可以在事件模型中定义驱动程序的所有外键,并且由于驱动程序可能具有许多事件。

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

and then define a last_event property in Event manager, like this: 然后在事件管理器中定义last_event属性,如下所示:

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

Then you can call it by Event.objects.last_event(driver) 然后可以通过Event.objects.last_event(driver)调用它

If you want to use driver.last_event, then you can define a last_event property in the Driver model: 如果要使用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

well i've solved a problem by adding: 我已经通过添加解决了一个问题:

    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)

so now it behaves as i planned: like a cacheable property 所以现在它的行为符合我的计划:就像可缓存的属性

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM