应用名/models.py(模型,定义模型类,一对多 models.ForeignKey):
from django.db import models
# 一个图书对应多个英雄人物
# 图书类(一类)
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, db_column='title') # 图书名称
bpub_date = models.DateField() # 出版日期
bread = models.IntegerField(default=0) # 阅读量
bcomment = models.IntegerField(default=0) # 评论量
isDelete = models.BooleanField(default=False) # 删除标记
# 英雄人物类(多类)
class HeroInfo(models.Model):
hname = models.CharField(max_length=20) # 英雄名
hgender = models.BooleanField(default=False) # 性别
hcomment = models.CharField(max_length=200, null=True, blank=False) # 备注
isDelete = models.BooleanField(default=False) # 删除标记
# 关联属性 (定义在多的一方)
hbook = models.ForeignKey('BookInfo') # 对应数据库表中的字段book_id。
# heroInfo.book是BookInfo对象; heroInfo.book_id只是BookInfo对象的id
关联查询
注意: 1、查询哪个表中的数据,就通过哪个模型类来查询。 2、通过关联属性的条件查询时,如果关联属性定义在该模型类中就直接使用关联属性,否则使用关联的模型类名小写。
一、查询关联的数据:
例1:查询id为1的图书关联的英雄信息。
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all() # 一类的对象.多类名小写_set.all()
通过模型类直接查询:
HeroInfo.objects.filter(hbook__id=1)
例2:查询id为1的英雄关联的图书信息。
h = HeroInfo.objects.get(id=1)
h.hbook # 通过关联属性,返回关联的图书对象。
h.hbook_id # 返回关联图书对象的id。(关联属性_id)
通过模型类直接查询:
BookInfo.objects.filter(heroinfo__id = 1) # 返回QuerySet查询集
二、根据关联属性的条件查询
通过多类的条件查询一类的数据:
一类名.objects.filter(多类名小写__多类属性名__条件名) # 关联属性没有定义在该类中,所以用多类名小写
通过一类的条件查询多类的数据:
多类名.objects.filter(关联属性__一类属性名__条件名) # 关联属性定义在该类中,所以直接用关联属性名
例:查询图书信息,要求图书关联的英雄的描述包含'八'。
BookInfo.objects.filter(heroinfo__hcomment__contains = '八')
例:查询图书信息,要求图书中的英雄的id大于3.
BookInfo.objects.filter(heroinfo__id__gt = 3)
例:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle = '天龙八部')