模型实例方法
- str:在将对象转换成字符串时会被调用
- save():将模型对象保存到数据表中
- delete():将模型对象从数据表中删除
模型类的属性
- 属性objects:管理器,是Manager类型的对象,用于与数据库进行交互
- 当没有为模型类定义管理器时,Django会为模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects
- 为模型类BookInfo定义管理器books语法如下
class BookInfo(models.Model):
...
books = models.Manager()
管理器Manager
- 管理器是Django的模型进行数据库操作的接口,Django应用的每个模型都拥有至少一个管理器
- Django支持自定义管理器类,继承自models.Manager
- 自定义管理器类主要用于两种情况
- 1.修改原始查询集,重写get_queryset()方法
- 2.向管理器类中添加额外的方法,如创建对象
- 1.修改原始查询集,重写get_queryset()方法
- 打开booktest/models.py文件,定义类BookInfoManager
#图书管理器
class BookInfoManager(models.Manager):
def get_queryset(self):
#默认查询未删除的图书信息
#调用父类的成员语法为:super(子类型, self).成员
return super(BookInfoManager, self).get_queryset().filter(isDelete=False)
class BookInfo(models.Model):
...
books = BookInfoManager()
- 2.在管理器类中定义创建对象的方法
- 当创建模型类对象时,django不会对数据库进行读写操作,调用save()方法才与数据库交互,进行insert或update操作,将数据保存到数据库中
- 如果模型类的属性比较多,逐个属性赋值很麻烦,推荐使用管理器方式
- 打开booktest/models.py文件,定义方法create
class BookInfoManager(models.Manager):
...
#创建模型类,接收参数为属性赋值
def create(self, title, pub_date):
#创建模型类对象self.model可以获得模型类
book = self.model()
book.btitle = title
book.bpub_date = pub_date
book.bread=0
book.bcommet=0
book.isDelete = False
return book
- 为模型类BookInfo定义管理器books语法如下
class BookInfo(models.Model):
...
books = BookInfoManager()
调用:book=BookInfo.books.create_book("abc",date(1980,1,1))
保存:book.save()
示例
1.配置url
- 打开test2/urls.py文件,配置url如下:
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
#引入booktest的url配置
url(r'^',include('booktest.urls'))
]
- 在booktest应用下创建urls.py文件,代码如下:
from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^$',views.index),
url(r'^delete(\d+)$',views.delete),
url(r'^create$',views.create),
]
2.定义视图
- 打开booktst.views.py文件,定义视图代码如下:
#coding=utf-8
from django.shortcuts import render,redirect
from models import *
from datetime import date
#查询所有图书并显示
def index(request):
list=BookInfo.books.all()
return render(request,'booktest/index.html',{'list':list})
#创建新图书
def create(request):
book=BookInfo.books.create('流星蝴蝶剑',date(1995,12,30))
book.save()
#转向到首页
return redirect('/')
#逻辑删除指定编号的图书
def delete(request,id):
book=BookInfo.books.get(pk=int(id))
book.isDelete=True
book.save()
#转向到首页
return redirect('/')
3.创建模板
- 打开test2/settings.py文件,配置模板查找目录TEMPLATES的DIRS
'DIRS': [os.path.join(BASE_DIR,'templates')],
- 创建templates/booktest/index.html文件
<html>
<head>
<title>Title</title>
</head>
<body>
<a href="/create/">创建</a>
<ul>
{%for book in list%}
<li>{{book.btitle}}--<a href="/delete{{book.id}}/">删除</a></li>
{%endfor%}
</ul>
</body>
</html>
4.运行
python manage.py runserver