Python Django:按计算字段筛选
在我的Django项目中,我需要计算一次旅行的日期范围,以查看旅行是否正在进行中Python Django:按计算字段筛选,python,django,django-models,django-views,Python,Django,Django Models,Django Views,在我的Django项目中,我需要计算一次旅行的日期范围,以查看旅行是否正在进行中 class TourTemplate(models.Model): length = models.IntegerField() description = models.TextField(max_length=1000) ... class Trip(models.Model): tourtemplate = models.ForeignKey(TourTemplate) st
class TourTemplate(models.Model):
length = models.IntegerField()
description = models.TextField(max_length=1000)
...
class Trip(models.Model):
tourtemplate = models.ForeignKey(TourTemplate)
start = models.DateField()
...
我将此添加到我的旅行模型中:
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()
这其中有两个好处:
尝试上述解决方案。希望有帮助:)无法理解如何将计算值插入查询集中。我的解决方案是为结束日期添加另一个日期字段(editable=False),并在创建新旅行时计算并保存结束日期:
# Calculate end date on save
def save(self, *args, **kwargs):
self.end = self.start+ timedelta(days=self.tourtemplate.length)
super(Trip, self).save(*args, **kwargs)
您是否尝试过“过滤我的查询集,以便只获取开始日期和计算结束日期之间的对象?”您应该显示这一部分,即艺术工作者可以帮助更多soI尝试注释结束日期:
Trip.objects.all().annotate(end=Trip.end())
这给了我“end()缺少1个必需的位置参数:'self'”您想使用对象的开始日期和计算结束日期查找两个给定日期内的对象吗?请查看。非常感谢Shubhanshu提供的解决方案和解释。这与我正在寻找的完全一样:)将在我回家并报告后试用。不幸的是,调用Trip.current\u Trip.all()
返回AttributeError:“TripManager”对象没有属性“tourtemplate”
。在我看到的所有示例中,模型管理器仅用于过滤。我们可以按照您描述的方式使用它吗?为什么不尝试在自定义管理器中插入上面的get\u queryset方法中的use\u for\u related\u fields=True。看看这个链接:这个链接:date_uurange=[start,end]comming from]在哪里??