在我的 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 点,您的情况需要自定义模型管理器。从这个 link 中了解它们.您的默认管理器由 Model.objects.all() 调用,如果您想更改或修改默认管理器返回的查询集,定义自定义管理器会很方便。
尝试上述解决方案。希望对您有所帮助:)
