首页 > Python基础教程 >
-
Django框架(七):模型(三) 关联、模型类的属性(2)
打开booktest/urls.py文件,新建一条url。
- urlpatterns = [
- ...
- url(r'^area/$', views.area),
- ]
在templates/booktest目录下,新建area.html文件。
- <html>
- <head>
- <title>地区</title>
- </head>
- <body>
- 当前地区:{{area.atitle}}
- <hr/>
- 上级地区:{{area.aParent.atitle}}
- <hr/>
- 下级地区:
- <ul>
- {%for a in area.areainfo_set.all%}
- <li>{{a.atitle}}</li>
- {%endfor%}
- </ul>
- </body>
- </html>
运行服务器。
python manage.py runserver
在浏览器中输出效果如下图。
2. 模型类的属性
属性objects:管理器,是models.Manager类型的对象,用于与数据库进行交互。
当没有为模型类定义管理器时,Django会为每一个模型类生成一个名为objects的管理器,自定义管理器后,Django不再生成默认管理器objects。
为模型类BookInfo定义管理器books语法如下:
- class BookInfo(models.Model):
- ...
- books = models.Manager()
2.1 管理器Manager
管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有至少一个管理器。Django支持自定义管理器类,继承自models.Manager。
自定义管理器类主要用于两种情况:
- 1.修改原始查询集,重写all()方法
- 2.向管理器类中添加额外的方法,如向数据库中插入数据。
1.修改原始查询集,重写all()方法。
a)打开booktest/models.py文件,定义类BookInfoManager
- #图书管理器
- class BookInfoManager(models.Manager):
- def all(self):
- #默认查询未删除的图书信息
- #调用父类的成员语法为:super().方法名
- return super().all().filter(isDelete=False)
b)在模型类BookInfo中定义管理器
- class BookInfo(models.Model):
- ...
- books = BookInfoManager()
2.在管理器类中定义创建对象的方法
对模型类对应的数据表进行操作时,推荐将这些操作数据表的方法封装起来,放到模型管理器类中。
a)打开booktest/models.py文件,定义方法create。
- class BookInfoManager(models.Manager):
- ...
- #创建模型类,接收参数为属性赋值
- def create_book(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
- # 将数据插入进数据表
- book.save()
- return book
b)为模型类BookInfo定义管理器books语法如下:
- class BookInfo(models.Model):
- ...
- books = BookInfoManager()
c)调用语法如下:
- 调用:book=BookInfo.books.create_book("abc",date(1980,1,1))
2.2 元选项
在模型类中定义类Meta,用于设置元信息,如使用db_table自定义表的名字。
数据表的默认名称为:
- <app_name>_<model_name>
- 例:
- booktest_bookinfo
例:指定BookInfo模型类生成的数据表名为bookinfo。
在BookInfo模型类中添加如下内容,代码如下:
- #定义图书模型类BookInfo
- class BookInfo(models.Model):
- ...
- #定义元选项
- class Meta:
- db_table='bookinfo' #指定BookInfo生成的数据表名为bookinfo