模型类关系
关系字段类型
关系型数据库的关系包括三种类型:
- ForeignKey:一对多,将字段定义在多的一端中。
- ManyToManyField:多对多,将字段定义在两端中。
- OneToOneField:一对一,将字段定义在任意一端中。
一对多关系:
#定义图书模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20)#图书名称 bpub_date = models.DateField()#发布日期 bread = models.IntegerField(default=0)#阅读量 bcomment = models.IntegerField(default=0)#评论量 isDelete = models.BooleanField(default=False)#逻辑删除 #定义英雄模型类HeroInfo class HeroInfo(models.Model): hname = models.CharField(max_length=20)#英雄姓名 hgender = models.BooleanField(default=True)#英雄性别 isDelete = models.BooleanField(default=False)#逻辑删除 hcontent = models.CharField(max_length=200)#英雄描述信息 hbook = models.ForeignKey('BookInfo')#英雄与图书表的关系为一对多,所以属性定义在英雄模型类中
多对多关系:
class TypeInfo(models.Model): tname = models.CharField(max_length=20) #新闻类别 class NewsInfo(models.Model): ntitle = models.CharField(max_length=60) #新闻标题 ncontent = models.TextField() #新闻内容 npub_date = models.DateTimeField() #新闻发布时间 ntype = models.ManyToManyField('TypeInfo') #通过ManyToManyField建立TypeInfo类和NewsInfo类之间多对多的关系
自关联:
对于地区信息、分类信息等数据,表结构非常类似,每个表的数据量十分有限,为了充分利用数据表的大量数据存储功能,可以可以设计成一张表,内部的关系字段指向本表的主键,这就是自关联的表结构。
#定义地区模型类,存储省、市、区县信息
class AreaInfo(models.Model):
atitle=models.CharField(max_length=30)#名称
aParent=models.ForeignKey('self',null=True,blank=True)#关系
关联查询:
1 由多到一的访问语法:
一对应的模型类对象.多对应的模型类名小写_set
b = BookInfo.objects.get(id=1)
b.heroinfo_set
2 由多到一的访问语法:
多对应的模型类对象.多对应的模型类中的关系类属性名
h = HeroInfo.objects.get(id=1)
h.hbook
#多对应的模型类对象.关联类属性_id h = HeroInfo.objects.get(id=1) h.book_id