模型类关系
1、一对多关系
例:图书类-英雄类
models.ForeignKey() 定义在多的类中。
2、多对多关系
例:新闻类-新闻类型类 体育新闻 国际
models.ManyToManyField() 定义在哪个类中都可以
3、一对一关系
例:员工基本信息类-员工详细信息类. 员工工号
models.OneToOnefield 定义在那个类中都可以
关联查询(一对多)
在一对多关系中,一对应的类我们把它叫做一类,多对应的类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性。
例:查询图书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.objects.filter(heroinfo__id__gt=3)
例:查询书名为"天龙八部"的所有英雄。
HeroInfo.objects.filter(hbook_btitle="天龙八部")
通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名)
通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名)
注意:
1、通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。
2、写关联查询条件的时候,如果类中没有关系属性,条件需要些对应类的名,如果类中有关系属性,直接写关系属性。
插入、更新、删除
调用一个模型对象的save方法的时候就可以实现对模型类对应数据表的插入和更新。
调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除。
自关联
省表、市表、县表(id,title,aParent_id)
自关联是一种特殊的一对多关系。
classAreaInfo(models.Model):
atitle=models.CharField(max_length=20)
models.ForeignKey('self',null=True,blank=True)
批量执行sql语句:
source areas.sql;
例:显示广州市的上级地区和下级地区
def areas(request):
"""获取广州市的上级地区和下级地区"""
#1、获取广州市的信息
AreaInfo.objects.get(atitle='广州市')
#2、查询广州市的上级地区
parent = area.aParent
#3、查询广州市的下级地区
children = area.areainfo_set.all()
# 使用模板
class AreaInfo(models.Model):
"""地区模型类"""
#地区名称
atitle = models.Charfield(max_length=20)
关系属性,代表当前地区的父级地区
aParent = models.ForeignKey('self',null = True,blank = True)
def areas(request):
"""获取广州市的上级地区和下级地区"""
#1、获取广州市的信息
area=AreaInfo.objects.get(atitle = "广州市")
#2、查询广州市的上级地区
parent = area.aParent
#3、查询广州市的下级地址
children = area.areainfo_set.all()
# 使用模板
return render(request,'booktest/areas.thml',{'area':area,'parent':parent,'children':children})
url(r'^area',views.areas),#自关联案例
{{area.atitle}}
{{parent.atitle}}
{% for child in children %}
<li>{{ child.atitle }} </li>
{% endfor %}
BookInfo.objects.all()->objects是一个什么东西?
objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。
objects是models.Manger类的一个对象。自定义管理器之后Django不再帮我们生成默认的objects管理器。
1、自定义一个管理器类,这个类继承models.Manger类。
2、再在具体的模型类里定义一个自定义管理器类的对象。
book = models.Manager() #自定义一个Manager类的对象
BookInfo.book.all()
class BookInfoManager(models.Manager):
objects = BookInfoManager() #自定义一个Manager类的对象
1、改变查询的结果集
2、添加额外的方法
BookInfoManger -》继承--》models.Manager
BookInfo-->继承-->models.Model