【问题标题】:Django model foreign key filterDjango模型外键过滤器
【发布时间】:2018-03-19 19:30:27
【问题描述】:

问题: 我有两个 django 模型:

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

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

现在我只需要为每个驱动程序预置和缓存的最后一个事件

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

我如何实现它? 有没有办法将关系限制为:

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

【问题讨论】:

  • 一个驱动程序只能有一个带有外键的事件。所以你要找的是event。或者您可能需要多对多关系。

标签: python django filter model


【解决方案1】:

为了避免循环依赖,可以在Event的模型中定义驱动程序的所有外键,而且由于一个驱动程序可以有很多事件。

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

【讨论】:

    【解决方案2】:

    好吧,我通过添加以下内容解决了一个问题:

        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)
    

    所以现在它的行为符合我的计划:就像一个可缓存的属性

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2012-07-15
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多