Django:按计算字段筛选

2024-10-01 19:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的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()
...

我在我的旅行模型中添加了以下内容:

^{pr2}$

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


Tags: 项目对象djangomodelmodelsdescriptionlengthmax
2条回答
# 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

现在,您可以拨打:

^{pr2}$

从中可以得出两个结论:

  1. 您在模型中定义的函数只能在该模型的实例(函数所在的实例)上调用。在
  2. 由于第1点,在您的案例中需要自定义模型管理器。从这个link中了解他们。您的默认管理器由调用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)

相关问题 更多 >

    热门问题