Python 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

在我的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()
...
我将此添加到我的旅行模型中:

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点,在您的案例中需要自定义模型管理器。从这里了解他们。默认管理器由Model.objects.all()调用,如果要更改或修改defualt管理器返回的queryset,定义自定义管理器非常方便
    尝试上述解决方案。希望有帮助:)

    无法理解如何将计算值插入查询集中。我的解决方案是为结束日期添加另一个日期字段(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]在哪里??