2017-08-12 80 views
0

一個多到一的關係設置我有三種模式:資產,AssetTypes和服務。資產需要得到每ň個月服務,並與服務多到一的關係。定義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

說實話,我會受到誘惑,非規範化這一切資產;您可以在添加新服務時更新的資產上添加next_service_due字段。然後,查詢就是所有資產與該字段比今天少。