Django的model中日期字段设置默认值的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django的model中日期字段设置默认值的问题相关的知识,希望对你有一定的参考价值。

之前写过这样一个model:

class MonthlyFeeMember(models.Model):
    worker = models.ForeignKey(Student, verbose_name=u"主检查人", related_name="as_monthly_fee_members")
    month = models.CharField(u检查月份, max_length=10, default=get_current_month())
    check_day = models.CharField(u检查日期, max_length=20, default=datetime.strftime(date.today(), "%Y-%m-%d"))
    building = models.ForeignKey(Building, verbose_name=u"检查楼栋", null=True, blank=True)
    create_time = models.DateTimeField(u创建时间, auto_now_add=True)

    class Meta:
        verbose_name_plural = verbose_name = u"水电费检查成员"
        unique_together = (worker, month)
        unique_together = (month, building)

写完之后发现每天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)即可。

以上是关于Django的model中日期字段设置默认值的问题的主要内容,如果未能解决你的问题,请参考以下文章

Django在具有多个值的多个字段中搜索

数据库中默认值的Django实现

Django forms select默认值和选中值的展示

Django models中的null和blank的区别

Django models中的null和blank的区别

具有默认值的外键上的 Django 1.7 迁移错误