2016-07-05 24 views
0

私のDjangoプロジェクトでは、旅行が現在進行中であるかどうかを確認するために、旅行の日付範囲を計算する必要があります。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 

を、単一のオブジェクトの終了日を動作し、返します。しかし、私はクエリーセットをフィルタリングして、開始日と計算された終了日の間のオブジェクトしか取得できないようにするにはどうすればよいですか?今

+0

を、あなたは私だけの間でオブジェクトを取得するように、「私のクエリセットをフィルタリングするために何を試してみました開始日と計算された終了日? –

+0

私は終了日に注釈をつけてみました: 'Trip.objects.all()。annotate(end = Trip.end())' これは私に " 1つの必須の位置引数: 'self' " – yabd

+0

オブジェクトの開始日と計算された終了日を使用して、2つの*指定された*日付内のオブジェクトを検索しますか? –

答えて

1
# 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のため、カスタムモデルマネージャが必要です。これについてはlinkからお読みください。デフォルトのマネージャーはModel.objects.all()によって呼び出され、defualtマネージャーが返すクエリーセットを変更または変更する場合は、カスタムマネージャーの定義が便利です。

上記の解決策を試してください。希望を助ける:)

+0

ありがとうShubhanshu、ソリューションと説明のために。これは私が探していたものとまったく同じように見えます:)私が家に帰って報告したらそれを試してみます。 – yabd

+0

残念ながら、 'Trip.current_trip.all()'を呼び出すと 'AttributeError: 'TripManager'オブジェクトに属性 'tourtemplate'がありません。 私が見たすべての例では、モデルマネージャはフィルタリングにのみ使用されています。あなたがそれを実際に記述した方法で実際に使用できますか? – yabd

+0

カスタムマネージャでget_querysetメソッドの上にuse_for_related_fields = Trueを挿入してみてください。このリンクをご覧ください:http://stackoverflow.com/questions/7489635/how-to-use-custom-manager-with-related-objectsとこのリンク:https://docs.djangoproject.com/ja/ dev/topics/db/managers /#manager-types – Shubhanshu

0

私の計算値をクエリセットに挿入する方法を理解できませんでした。私のソリューションは、終了日(編集=偽)のための別の日付フィールドを追加し、新しい旅の作成時に終了日を計算し、保存された:

# 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) 
関連する問題