第一篇最后想略过的部分,被很多人追着问,我反复解释还不如写出来。
顺着上次的博客系统和数据模型继续写。这一篇的主题就是针对模型进行操作。
创建帖子对象
from django.contrib.auth.models import User
from blog.models import Post
user = User.objects.get(username='admin')
Post.objects.create(title='A post',slug='A slug',body='A post body',author=user)
Post.save()
更新对象
Post.title='New title'
Post.save()
访问数据对象
all_posts = Post.objects.all()
过滤对象
Post.objects.filter(publish_year=2016)
<pre name="code" class="python">Post.objects.filter(publish_year=2016).exclude(title_endwith='temp')
排序
Post.objects.order_by('title')
删除对象
Post.objects.get(id=1).delete()
这上面的操作都是在称之为QuerySet上的操作,因为很多时候都是在内存中处理数据,很快,出了以下情况:
1. 第一次遍历这个QuerySet对象
2. 取子集的时候,比如:Post.objects.all()[2:]
3. 缓存对象4. 计算repr()或者len()
5. 显示的调用list()
6. 测试真伪bool()
定制数据模型管理器
除了objects这个缺省的数据模型管理器之外,还可以定制管理器。这里有两种办法,第一种是直接修改缺省管理器queryset,一种就是在objects下面创建新的管理器,然后用类似Post.my_manager.all()来引用它。还是用上一篇的例子,在models.py里面增加定制管理器:
class PublishedManager(models.Manager):
def get_queryset(self):
return super(PublishedManager,self).get_queryset().filter(status='published')
class Post(models.Model):
# ...
objects = models.Manager() # 缺省模型管理器
published = PublishedManager() # 定制发布状态帖子数据模型管理器
所以使用定制管理器可以在更特定数据集做操作,比如Post.published.filter(title_startwith='FIVE')。对于数据模型操作的最后一步是数据可视化,接下来我们需要把各种数据和数据子集可视化为页面的表格和列表,这个动作在view.py里面完成。
def post_detail(request,year,month,day,post):
post=get_object_or_404(Post,slug=post,status='published',publish_year=year,publish_month=month,publish_day=day)
return render(request,'blog/post/detail.html',{'post':post})
在数据模型上面还可以增加很多,Django的在线文档零零碎碎都有提及,在具体项目中,慢慢体会吧。