【Django总结】Django的时间字段DateTimeField
⼀. Django的时间字段DateTimeField
创建django的model时,有DateTimeField、DateField和TimeField三种类型可以⽤来创建⽇期字段,其值分别对应着datetime()、date()、time()三中对象。这三个field有着相同的参数auto_now和auto_now_add,表⾯上看起来很easy,但实际使⽤中很容易出错,下⾯是⼀些注意点。
<1>DateTimeField.auto_now
这个参数的默认值为false,设置为true时,能够在保存该字段时,将其值设置为当前时间,并且每次修改model,都会⾃动更新。因此这个参数在需要存储“最后修改时间”的场景下,⼗分⽅便。需要注意的是,设置该参数为true时,并不简单地意味着字段的默认值为当前时间,⽽是指字段会被“强制”更新到当前时间,你⽆法程序中⼿动为字段赋值;如果使⽤django再带的admin管理器,那么该字段在admin中是只读的。
<2>DateTimeField.auto_now_add
这个参数的默认值也为False,设置为True时,会在model对象第⼀次被创建时,将字段的值设置为创建时的时间,以后修改对象时,字段的值不会再更新。该属性通常被⽤在存储“创建时间”的场景下。与a
uto_now类似,auto_now_add也具有强制性,⼀旦被设置为True,就⽆法在程序中⼿动为字段赋值,在admin中字段也会成为只读的。
<3>admin中的⽇期时间字段
auto_now和auto_now_add被设置为True后,这样做会导致字段成为editable=False和blank=True的状态。editable=False将导致字段不会被呈现在admin中,blank=Ture表⽰允许在表单中不输⼊值。此时,如果在admin的fields或fieldset中强⾏加⼊该⽇期时间字段,那么程序会报错,admin⽆法打开;如果在admin中修改对象时,想要看到⽇期和时间,可以将⽇期时间字段添加到admin类的readonly_fields中:
⼆. Django的外键字段ForeignKey
有两个数据模型栏⽬模型和⽂章模型ArticleColumn和ArticlePost
ArticleColumn:
class ArticleColumn(models.Model):
# ⽤户与栏⽬是“⼀对多”关系,所以⽤ForeignKey,⼀个⽤户可以设置多个栏⽬,此处的user字段对应实际表中的user_id,来⾃于User表中主键
user = models.ForeignKey(User, related_name='article_column')
column = models.CharField(max_length=100)
created = models.DateTimeField(auto_now_add=True)
ArticlePost:
class ArticlePost(models.Model):
author = models.ForeignKey(User, related_name='article')
title = models.CharField(max_length=200)
slug = models.SlugField(max_length=500)
column = models.ForeignKey(ArticleColumn, related_name='article_column')
body = models.TextField()
created = models.DateTimeField(w())
updated = models.DateTimeField(auto_now_add=True)
# media/%Y%m%d/为图⽚的真实放置路径,因为settings中已经配置了MEDIA_ROOT为media⽂件夹,blank=True允许表单的该字段对应值为空,意思是⾮必填字段
avatar = models.ImageField(upload_to='%Y%m%d/', blank=True)
可以看到在ArticlePost模型中有⼀个字段为column,且类型为ForeignKey,意思是外键,代表的是“多对⼀”的关系,第⼀个参数ArticleColumn是对应的模型名称,related_name 为反查时的关联名称。
多对⼀指的是,多个⽂章可以对应⼀个栏⽬,⽐如有10篇⽂章都是属于django栏⽬的(当然⼀个⽂章也可以对应多个栏⽬,这样就是多对多关系了:ManyToManyField,此处我们设计不存在这种情况),
有了外键关系后,那如何去查询某篇⽂章对应的所属栏⽬呢?
article = (id=150)
如果不使⽤外键关系,想查询某篇⽂章对应的所属栏⽬呢?
# 获取该⽂章对象
article = (id=150)
# 到该⽂章对象对应的column_id,column_id这⼀列就是因为ArticlePost模型中有column字段且将ArticleColumn作为外键,所以将ArticleColumn模型对应表中的主键id的值作为column_id的值,将列名命名为column_id lumn_id
# 根据上⾯查出来的id到该栏⽬对象
column = (lumn_id)
# 输出栏⽬名称
那怎么反查某个栏⽬下有多少⽂章呢?
# 查询出叫django的栏⽬
column = (column='django')
# 通过column这个实例.article_column.all(),查询出该栏⽬下的所有⽂章,article_column就是在ArticlePost模型中的related_name的值
column.article_column.all()
# 反查django这个栏⽬下title中包含'list'字符串的⽂章
column.article_column.filter(title__contains='list')
class YourAdmin(admin.ModelAdmin):
readonly_fields = ('save_date', 'mod_date',)
ister(Tag, YourAdmin)
<4>如何将创建时间设置为“默认当前”并且可修改
那么问题来了。实际场景中,往往既希望在对象的创建时间默认被设置为当前值,⼜希望能在⽇后修改它。怎么实现这种需求呢?
django中所有的model字段都拥有⼀个default参数,⽤来给字段设置默认值。可以⽤w来替换auto_now=True或auto_now_add=True。w对应着django.w(),因此需要写成类似下⾯的形式
from django.db import models
import django.utils.timezone as timezonedjango admin 自定义页面
class Doc(models.Model):
add_date = models.DateTimeField('保存⽇期',default = w)
mod_date = models.DateTimeField('最后修改⽇期', auto_now = True)
html页⾯从数据库中读出DateTimeField字段时,显⽰的时间格式和数据库中存放的格式不⼀致,⽐如数据库字段内容为2016-06-03 13:00:00,但是页⾯显⽰的却是Apr. 03, 2016,
为了页⾯和数据库中显⽰⼀致,需要在页⾯格式化时间,需要添加<td>{{ infor.updatetime|date:"Y-m-d H:i:s" }}</td> 类似的过滤器。刷新页⾯,即可正常显⽰。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论