2017-08-28 66 views
0

我有2個日期字段,我想自動更新日期 當您閱讀我的代碼時,您將會了解更多信息。 代碼將無法正常工作,直到我自己 更新更新的領域我怎麼可以讓它自動更新(更新域)自動在django中自動更改日期字段

STATUS_CHOICES = (
('P', 'Paid'), 
('U', 'UNPAID'), 
) 

status = models.CharField(
    max_length=1, choices=STATUS_CHOICES) 
updated = models.DateTimeField(default=datetime.now()) 
expiry = models.DateTimeField(default=datetime.now() + timedelta(days=30)) 

def save(self): 
    if(self.expiry >= self.updated): 
     self.status = default = "P" 
    else: 
     self.status = default = "U" 
     self.expiry = default=self.updated+timedelta(days=1) 

    super(Users, self).save() 
+0

你是什麼意思的「自動」?您是否希望此代碼按計劃執行? – d2718nis

+0

@ d2718nis否,直到我打開用戶頁面並自行更新日期(更新字段)時,代碼纔會生效。我想這樣做是自動的,所以如果今天是21-2而在一個月之後它是21-3它會自動改變狀態(取決於到期日期)它不會改變它,直到我手動更新字段 –

回答

0

DateTimeFieldauto_now屬性,將在現場設置爲當前每次保存對象時記錄日期。

主要問題是什麼事件應該觸發保存操作。例如,您可以改進視圖,以便每次有人訪問該頁面時,您的模型都會根據所需的DateTimeField進行更新。另一方面,您可能希望按計劃執行此操作,因此您應該使用Cron,CeleryHuey之類的內容。

+0

它看起來像我被迫使用芹菜。非常感謝 –

+0

samer hassan,不客氣。如果這個答案是有用的,不要忘記檢查它是正確的。謝謝! – d2718nis

0

就你而言,你有兩種選擇。

  1. 製作一些定期執行的代碼,根據當前日期更新狀態。
  2. 根本不要將狀態存儲在數據庫中。如果它只能取決於expiry字段,它可以是一個計算結果property

P.S.

這與您所問的無關,但我有一個建議。千萬不要使用datetime.now()的直接結果作爲DateTimeField的默認值。這是誤導你的,它與你想達到的不一樣。 datetime.now將在導入時執行(當服務器啓動時)並且保持不變直到下次重新啓動。 如果您希望默認值是創建記錄的確切時間,那麼default值需要是一個函數(將每次執行),而不是函數的結果。 這意味着updated需要是DateTimeFiled(default=datetime.now)(沒有括號)。

這個邏輯更像是一個叫created_atdate_created而不是updated的字段,但這是你的邏輯。

+0

謝謝你指出 –