Python Django,关联查询(多表查询)(一对多)

应用名/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 = '天龙八部')

猜你喜欢

转载自blog.csdn.net/houyanhua1/article/details/84953388