2017-08-12 10 views
0

私は、アセット、アセットタイプ、サービスという3つのモデルを持っています。資産はnの月ごとにサービスを受ける必要があり、サービスと多対1の関係にあります。計算と多対1の関係を持つDjangoクエリーセットを定義する

class AssetType(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(verbose_name="Asset Type", max_length=100) 
    service_period = models.PositiveSmallIntegerField(verbose_name="Service Period (in months)", null=True, blank=True, default=12) 

class Asset(models.Model): 
    id = models.AutoField(primary_key=True) 
    type = models.ForeignKey(AssetType, on_delete=models.PROTECT) 

    def service_period(self): 
     return AssetType.objects.get(pk=self.type.id).service_period 

    def service_history(self): 
     return self.service_set.all().order_by('-date') 

    def service_due_date(self): 
     if self.service_period()==None: 
      return None 
     elif self.service_history().count()==0: 
      return datetime.strptime('2017-01-01', '%Y-%m-%d').date() 
     else: 
      last_service_date = self.service_history().latest('date').date 
      return last_service_date + timedelta(self.service_period()*30) 

     def service_overdue(self): 
      return ((self.service_due_date()!=None) and self.service_due_date() < date.today()) 

class Service(models.Model): 
    id = models.AutoField(primary_key=True) 
    date = models.DateField() 
    asset = models.ForeignKey(Asset, on_delete=models.CASCADE) 

私は、自分のサービスに遅れている資産のリストを返すクエリセットを作る方法を工夫しています。私は、モデルメソッドを使用するように感じる赤ちゃん、と私はクエリフィルタを定義するより良いでしょうか?

私はそれ以上のクエリセットフィルタを使用できるように、期限切れの資産リストをクエリセットにする必要があります。

ご協力いただければ幸いです!

+1

あなたの質問は不明です。あなたのモデルのどれも他のモデルとは関係がありません。関係フィールドを追加するように編集してください。 'Asset.service_due_date()'とは何ですか? –

+0

私の悪い、サービスクラスの最後の行(決定的には外部キーを持っていました)と他の方法が欠けています。 – Majoch

答えて

0

これは少しトリッキーです。あなたはその最新のサービス日を今日より前の日付であるマイナス30

を掛けタイプのサービス期間は、正直に言うと、すべての資産を探している言葉でクエリを入れて

は、私はこれを非正規化するように誘惑されるだろう。新しいサービスを追加するときに更新されるAssetにnext_service_dueフィールドを追加することができます。次に、そのフィールドが今日よりも小さいすべてのアセットだけがクエリになります。

関連する問題