Skip to main content
 首页 » 编程设计

python之Django:按计算字段过滤

2024年10月17日34myhome

在我的 Django 项目中,我需要计算旅行的日期范围以查看该旅行当前是否在途中。

class TourTemplate(models.Model): 
    length = models.IntegerField() 
    description = models.TextField(max_length=1000) 
... 
 
class Trip(models.Model): 
    tourtemplate = models.ForeignKey(TourTemplate) 
    start = models.DateField() 
... 

我将其添加到我的 Trip 模型中:

def end(self): 
    length = self.tourtemplate.length 
    start = self.start 
    a = start + timedelta(days=length) 
    return a 

它在 shell 中工作并返回单个对象的结束日期。但是我如何过滤我的查询集,以便我只获取开始日期和计算结束日期之间的对象?

请您参考如下方法:

# First, define a manager subclass 
class TripManager(models.Manager): 
    def get_queryset(self): 
        length= self.tourtemplate.length 
        start= self.start 
        end=start+ timedelta(days=length) 
        return super(TripManager, self).get_queryset().filter(date__range=[start, end]) 
 
class Trip(models.Model): 
 
    objects = models.Manager() # The default manager. 
    current_trip = TripManager() # New manager 

现在,您可以调用:

Trip.current_trip.all() 

两个要点:

  1. 您在模型中定义的函数只能在该模型的实例(函数所在的位置)上调用。
  2. 并且由于第 1 点,您的情况需要自定义模型管理器。从这个 link 中了解它们.您的默认管理器由 Model.objects.all() 调用,如果您想更改或修改默认管理器返回的查询集,定义自定义管理器会很方便。

尝试上述解决方案。希望对您有所帮助:)