Django框架(14.Django中模型类的关系,以及模型类关联查询)

模型类关系

1. 一对多关系

例:图书类-人物类

     models.ForeignKey() 定义在多的类中。

2.多对多关系

     例:新闻类-新闻类型类 体育新闻 国际新闻

    models.ManyToManyField() 定义在哪个类中都可以。

3.一对一关系

例:员工基本信息类-员工详细信息类. 员工工号

    models.OneToOneField定义在哪个类中都可以。

一对多举例:

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)


class HeroInfo(models.Model):
    """英雄人物模型类"""
    # 英雄名
    hname = models.CharField(max_length=20)
    # 性别
    hgender = models.BooleanField(default=False)
    # 备注
    hcomment = models.CharField(max_length=200)
    # 关系属性
    hbook = models.ForeignKey('BookInfo', on_delete='CASCADE')
    # 删除标记
    isDelete = models.BooleanField(default=False)

多对多举例:

# 新闻类型类
class NewsType(models.Model):
    # 类型名
    type_name = models.CharField(max_length=20)
    # 关系属性,代表类型下面的信息
    type_news = models.ManyToManyField("NewsInfo")


# 新闻类
class NewsInfo(models.Model):
    # 新闻标题
    title = models.CharField(max_length=128)
    # 发布时间
    pub_date = models.DateTimeField(auto_now_add=True)
    # 信息内容
    content = models.TextField()
    # 关系属性
    # news_type = models.ManyToManyField('NewsType')

一对一举例:

# 员工基本信息类
class EmployeeBasicInfo(models.Model):
    # 姓名
    name = models.CharField(max_length=20)
    # 性别
    gender = models.BooleanField(default=False)
    # 年龄
    age = models.IntegerField()
    # 关联属性
    employee_detail = models.OneToOneField('EmployeeDetailInfo',on_delete=models.CASCADE)


# 员工基本信息类
class EmployeeDetailInfo(models.Model):
    # 联系地址
    addr = models.CharField(max_length=256)
    # 关系属性,代表员工基本信息
    # employee_basic = models.OneToOneField("EmployeeBasicInfo",on_delete=models.CASCADE)

Django中字段属性 on_delete参数含义:

on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做
on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET,         # 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

 

关联查询(一对多

1 .查询和对象关联的数据

在一对多关系中,一对应的类我们把它叫做一类,多对应的那个类我们把它叫做多类,我们把多类中定义的建立关联的类属性叫做关联属性

注意:

    1. 通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。

     2. 写关联查询条件的时候,如果类中没有关联属性,条件需要对应类的名,如果类中有关系属性,直接写关系属性

图书模型类:BookInfo      英雄模型类:HeroInfo

例1:查询id为1的图书关联的英雄的信息。

    b=BookInfo.objects.get(id=1)    # 先查到这个数据

    b.heroinfo_set.all()          # 然后    .模型类名(小写)_set.all()

通过模型类查询:

    HeroInfo.objects.filter(hbook__id=1)    #  最终查什么信息,在那个表中,就用哪个模型类.objects......   

                                                                  #  有关联属性就直接,       属性名称_ _ 属性名 = ?

例2:查询id为1的英雄关联的图书信息。

    h = HeroInfo.objects.get(id=1)

    h.hbook

通过模型类查询:

   BookInfo.objects.filter(heroinfo__id=1)

格式:

Django框架(14.Django中模型类的关系,以及模型类关联查询)_第1张图片

由一类的对象查询多类的时候:

    一类的对象.多类名小写_set.all() #查询所用数据

由多类的对象查询一类的时候:

    多类的对象.关联属性  #查询多类的对象对应的一类的对象

由多类的对象查询一类对象的id时候:

    多类的对象. 关联属性_id

11.2 通过模型类实现关联查询

注意:

    1. 通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查。

     2. 写关联查询条件的时候,如果类中没有关联属性,条件需要对应类的名,如果类中有关系属性,直接写关系属性

例:查询图书信息,要求图书关联的英雄的描述包含'八'。

BookInfo.objects.filter(heroinfo__hcomment__contains='八')

例:查询图书信息,要求图书中的英雄的id大于3.

BookInfo.objects.filter(heroinfo__id__gt=3)

例:查询书名为“天龙八部”的所有英雄。

HeroInfo.objects.filter(hbook__btitle='天龙八部')

通过多类的条件查询一类的数据:

    一类名.objects.filter(多类名小写__多类属性名__条件名)

通过一类的条件查询多类的数据:

    多类名.objects.filter(关联属性__一类属性名__条件名)

 

你可能感兴趣的:(Django,Django框架)