Django中的模型与模型之间一般会存在关联关系,如以下两个表:
# 图书模型
class BookInfo(models.Model):
title = models.CharField(max_length=20)
pub_date = models.DateField()
read_num = models.IntegerField(default=0)
comment_num = models.IntegerField(default=0)
is_delete = models.BooleanField(default=False)
# 英雄模型
class HeroInfo(models.Model):
name = models.CharField(max_length=20)
gender = models.BooleanField(default=True)
age = models.IntegerField()
comment = models.CharField(max_length=200)
hbook = models.ForeignKey('BookInfo',default=None, on_delete=models.CASCADE)
is_delete = models.BooleanField(default=False)
英雄模型通过 book = models.ForeignKey('BookInfo',default=None, on_delete=models.CASCADE)
与图书模型产生关联:
图书 -> 英雄
是一个 1对多
的关系,而反过来 英雄 -> 图书
则是一个多对1
的关系。
我们可以将存放关联属性的类称之为多类
,如关联两个表的属性hbook
存放在HeroInfo
,则HeroInfo
称为多类,相应的BookInfo
被成为一类。
存在关联关系的两个模型,常用查询方法如下:
1对多
的关系进行查询时,如图,使用BookInfo
的对象b
,通过b.heroinfo_set.all()
来进行查询;‘多对1’的关系进行查询时,使用
HeroInfo
的对象h
,通过关联属性hbook
,经h.hbook
操作来查询。
操作示例
(1) 查询出 id为2 的图书中所关联的英雄人物的信息。
# 常规查询
b = Booktest.objects.get(id=2)
b.heroinfo_set.all()
# 通过模型类查询(需要查询英雄信息,所以从HeroInfo类开始入手,即“多查1”)
HeroInfo.objects.filter(hbook__id=2)
输出:
>> b = BookInfo.objects.get(id=2)
>> b.heroinfo_set.all()
<QuerySet [<HeroInfo: 乔峰>, <HeroInfo: 段誉>, <HeroInfo: 虚竹>, <HeroInfo: 王语嫣>]>
>> HeroInfo.objects.filter(book__id=2)
<QuerySet [<HeroInfo: 乔峰>, <HeroInfo: 段誉>, <HeroInfo: 虚竹>, <HeroInfo: 王语嫣>]>
(2)查询图书关联的英雄描述中包含“八”的图书信息。
# 通过模型类查询(要查的是图书,从BookInfo入手,即“1查多”)
BookInfo.objects.filter(heroinfo__comment__contains='八')
输出:
>> BookInfo.objects.filter(heroinfo__comment__contains='八')
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>]> # 数据库里郭靖和乔峰的描述都是“降龙十八掌”,所以查询结果包含这两本书
(3)查询图书所关联的英雄id大于3的图书信息。
# 通过模型类查询(要查的还是图书,从BookInfo入手,即“1查多”)
BookInfo.objects.filter(heroinfo__id__gt=3)
输出:
>> BookInfo.objects.filter(heroinfo__id__gt=3)
<QuerySet [<BookInfo: 射雕英雄传>, <BookInfo: 射雕英雄传>, <BookInfo: 天龙八部>, <BookInfo: 天龙八部>, <BookInfo: 天龙八部>]>
网友评论