簡體   English   中英

Django:按計算字段過濾

[英]Django: Filter by calculated field

在我的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

在外殼中,它可以工作並返回單個對象的結束日期。 但是,如何過濾查詢集,以便僅在開始和計算的結束日期之間獲取對象?

# 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點,您的情況需要自定義模型管理器。 從此鏈接中了解它們。 默認管理器由Model.objects.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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM