Django模型关系及相关操作(第八天)

一、通过模型类实现关联查询
例1:查询图书信息,要求图书关联的英雄的描述包含‘八’。
BookInfo.objects.filter(heroinfo__hcomment__contains=‘八’)
例2:查询图书信息,要求图书中的英雄的id大于3。
BookInfo.objects.filter(heroinfo__id__gt=3)
例3:查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle=‘天龙八部’)
总结:通过模型类实现关联查询时,要查哪个表中的数据,就需要通过哪个类来查,写关联查询条件时,如果类中没有关系属性,条件需要写对应类的名称小写,如果类中有关系属性,直接写关系属性。

二、模型的插入和删除
调用一个模型对象的save方法的时候就可以实现对模型类对应数据表的插入和更新。
调用一个模型对象的delete方法的时候就可以实现对模型类对应数据表的删除。

三、自关联
自关联是一种特殊的一对多的关系。

四、管理器
BookInfo.objects.all()中的objects是Django帮我自动生成的管理器对象,通过这个管理器可以实现对数据的查询。

如何自定义管理器呢?
一旦在模型类中定义了管理类对象,将不再使用Django提供的管理器,例如:book = models.Manager()
此时使用终端查询命令为BookInfo.book.all()
如果我们要自定义管理器,需要创建一个模型管理器类继承Manager()。
自定义管理器类的应用场景:
1)改变查询的结果集
比如调用BookInfo.books.all()返回的是没有删除的图书的数据
2)添加额外的方法,操作后台数据表
使用self.model可以获取到self所在模型类的类名。
自定义管理器代码如下:

from django.db import models

# Create your models here.

class BookInfoManager(models.Manager):
    '''图书模型管理器类'''
    # 1.改变查询结果集
    def all(self):
        # 1.调用父类的all,获取所有数据
        books = super().all()  # QuerySet
        # 2.对数据进行过滤
        books = books.filter(isDelete=False)
        # 3.返回books
        return books
    
    # 2.封装函数:操作模型类对应的数据表(增删改查)
    def create_book(self, btitle, bpub_date):
        # 1.创建一个图书对象
        # 获取self所在的模型类
        model_class = self.model
        book = model_class()
        # book = BookInfo()
        book.btitle = btitle
        book.bpub_date = bpub_date
        # 2.保存进数据库
        book.save()
        # 3.返回book
        return book

# 一类
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)

    # book = models.Manager()  # 自定义一个Manager类对象
    objects = BookInfoManager()  # 自定义一个BookInfoManager类对象

通过模型类中自定义的管理类,就可以通过BookInfo.objects.create_book(‘三国演义’,‘2020-05-01’)对数据值进行插入数据库,其实在Django默认的管理器中也有个create方法,但需要对关键字参数传值,才能保存数据到数据库,比如BookInfo.objects.create(btitle=‘三国演义’,bpub_date=‘2020-05-01’)

五、元选项
应用场景,我们在做项目迁移的时候,因为原来的数据库表名已生成,但是原来生成的表名依赖于项目名称,一旦项目名称改变了但数据库表名没有改变,就会出现找不到的情况。
为了使模型类应用的表名不依赖于应用的名字,就需要用到元选项。
使用方法:在模型中定义一个元类Meta,在里面定义一个属性db_table就可以指定表名,重新执行迁移后,会看到后台数据表名称变了,数据不会丢失。

# 一类
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)

    # book = models.Manager()  # 自定义一个Manager类对象
    objects = BookInfoManager()  # 自定义一个BookInfoManager类对象

    class Meta():
        db_table='bookinfo'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值