之前寫過這樣一個model:
class MonthlyFeeMember(models.Model):worker = models.ForeignKey(Student, verbose_name=u"worker", related_name="as_monthly_fee_members")month = models.CharField(u'month', max_length=10, default=get_current_month())check_day = models.CharField(u'check day', max_length=20, default=datetime.strftime(date.today(), "%Y-%m-%d"))building = models.ForeignKey(Building, verbose_name=u"building", null=True, blank=True)create_time = models.DateTimeField(u'create time', auto_now_add=True)class Meta:verbose_name_plural = verbose_name = u"month fee member"unique_together = ('worker', 'month')
寫完之后發現每天runserver的時候都會提示要makemigrations,經過排查發現問題出在設置的默認值上。
把字段check_day的默認值設置成default=datetime.strftime(date.today(), "%Y-%m-%d") 會導致它在每天都是不同的值,相當于每過一天都重新給字段check_day設置了默認值,這樣就會改變model導致需要重新migrations。
在這里可以把default修改為:default=datetime.strftime(date.today, "%Y-%m-%d")就行了,這樣在真正插入數據的時候才會執行函數,取出返回值。
當然,最好使用DateField來表示check_day:check_day = models.DateField(u'檢查日期', auto_now=True)。
但是Django并沒有提供月份字段MonthField, 因此只能用CharField來代替,這時候如果想設置月份的默認值可以把這個model中的字段month = models.CharField(u'檢查月份', max_length=10, default=get_current_month())修改為:month = models.CharField(u'檢查月份', max_length=10, default=get_current_month)即可。