美文网首页
Django模型关联操作

Django模型关联操作

作者: 0938159669cd | 来源:发表于2018-09-12 15:56 被阅读0次

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.png
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: 天龙八部>]>

相关文章

网友评论

      本文标题:Django模型关联操作

      本文链接:https://www.haomeiwen.com/subject/kdgvgftx.html