day09-模型
2020-01-30 本文已影响0人
wenyilab
1、模型关系
1)一对多关系
例:图书类-英雄类
models.ForeignKey() 定义在多类中
2)多对多关系
例:新闻类-新闻类型类 体育新闻 国际xinw
models.ManytoManyField() 定义在哪个类中都可以
# 新闻类型类
class NewsType(models.Model):
# 类型名
type_name = models.CharField(max_length=20)
# 关系属性
type_news = models.ManyToManyField('NewsInfo')
class NewsInfo(models.Model):
# 新闻标题
title = models.CharField(max_length=128)
# 发布时间
pub_date = models.DateTimeField(auto_now_add=True)
# 信息内容
content = models.TextField()
# 关系属性
# news_type = models.ManyToManyField('NewsType')
3)一对一关系
例:员工基本信息类-员工详细信息类,员工工号
models.OnetoOneField 定义在哪个类中都可以
# 员工基本信息类
class EmployeeBasicInfo(models.Model):
# 姓名
name = models.CharField(max_length=20)
# 性别
gender = models.BooleanField(default=False)
# 年龄
age = models.IntegerField()
# 关系属性,代表员工的详细信息
employee_detail = models.OneToOneField('EmployeeDetailInfo')
# 员工详细信息类
class EmployeeDetailInfo(models.Model):
# 联系地址
addr = models.CharField(max_length=256)
# 教育经历
# 关系属性,代表员工的基本信息
employee_basic = models.OneToOneField('EmployeeBasicInfo')
2、关联查询(一对多)
例:查询图书id为1的所有英雄信息
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
通过模型类查询:
HeroInfo.objects.filter(hbook__id=1)
例:查询id为1的英雄的图书信息
h = HeroInfo.objects.get(id=1)
h.hbook
通过模型类查询:
BookInfo.objects.filter(heroinfo__id=1)
通过模型类实现关联查询
例:查询图书信息,要求图书中英雄的描述包含‘八’
BookInfo.objects.filter(heroinfo__hcomment__contains='八')
例:查询图书信息,要求图书中的英雄id大于3
BookInfo.object.filter(heroinfo__id__gt=3)
例:查询书名为“天龙八部”的所有英雄
HeroInfo.objects.filter(hbook__btitle='天龙八部')
注意:
通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。
写关联查询条件的时候,如果类中没有关系属性,条件需要对应类的名,如果类中有关系属性,直接写关系属性。
3、插入与删除
调用模型对象save方法时就可以完成插入与更新
调用模型对象delete方法时就可以完成删除
4、自关联
自关联是一种特殊的一对多关系
案例:显示广州市的上级地区和下级地区
地区表:id,title,parentid;
mysql终端批量执行sql语句:source areas.sql;
视图函数
def areas(request):
'''获取广州市的上级地区和下级地区'''
# 1、获取广州市的信息
area = AreaInfo.objects.get(atitle = '广州市')
# 2、查询广州市的上级地区
parent = area.aParent
# 3、查询广州市的下级地区
children = area.areainfo__set.all()
# 4、使用模版
return render(request,'booktest/areas.html',
{'area':area,'parent':parent,'children':children})
urls
urlpatterns = [
url(r'^index/$',views.index),
url(r'^create/$',views.create),
url(r'^delete(\d+)$',views.delete),
url(r'^areas$',views.areas),
]
模版文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自关联案例</title>
</head>
<body>
<h1>当前地区</h1>
{{ area.atitle }}<br/>
<h1>父级地区</h1>
{{ parent.atitle }}<br/>
<h1>下级地区</h1>
<ul>
{% for child in children %}
<li>{{ child.atitle }}</li>
{% endfor %}
</ul>
</body>
</html>
5、模型管理器
objects是Django自动生成的models.Manager类对象,自定义管理器之后就不会再生成objects对象。
objects = models.Manager()
objects = BookInfoManager() # 自定义模型管理器
代码
1)改变查询的结果集
2)封装函数:操作模型类对应的数据表(增删改查)
class BookInfoManager(models.Manager):
'''图书模型管理类对象'''
# 1、改变查询的结果集
def all(self):
# 1、调用父类all,获取所有
books = super().all()
# 2、对数据进行过滤
books = books.filter(isDelete=False)
# 3、返回books
return books
# 2、封装函数:操作模型类对应的数据表(增删改查)
def create_book(self,btitle,bpub_date):
# 1、创建一个图书对象
# 使用self.model可以创建跟自定义管理器对象对应模型类对象
model_class = self.model
book = model_class()
book.btitle = btitle
book.bpub_date = bpub_date
# 2、保存对象
book.save()
# 3、返回对象
return book
6、元选项
很重要
指定模型类对应的表名
class Meta:
db_table = 'bookinfo'