Django之模型

补充上一篇

  • 在 Django 中使用 MySQL 数据库,除了上篇里面的设置外,还要进行导入,在__init__文件下添加下面两句

    import pymysql
    pymysql.install_as_MySQLdb()
    
    • 当然,前提是你的这个环境安装了pymysql 这个包

模型

  • django 会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后 django 不会再创建自动增长的主键列。

    属性=models.字段类型(选项)
    

字段类型

  • 记得还要导入django.db.models 这个包
类型描述
AutoField自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性。
BooleanField布尔字段,值为True或False。
NullBooleanField支持Null、True、False三种值。
CharField(max_length=最大长度)字符串。参数max_length表示最大字符个数。
TextField大文本字段,一般超过4000个字符时使用。
IntegerField整数
DecimalField(max_digits=None, decimal_places=None)十进制浮点数。参数max_digits表示总位。参数decimal_places表示小数位数。
FloatField浮点数。参数同上
DateField:([auto_now=False, auto_now_add=False])日期。1)参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false。2) 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false。3)参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
TimeField时间,参数同DateField。
DateTimeField日期时间,参数同DateField。
FileField上传文件字段。
ImageField继承于FileField,对上传的内容进行校验,确保是有效的图片。

选项

  • 通过选项实现对字段的约束,选项如下:

    选项名描述
    default默认值。设置默认值。
    primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用。
    unique如果为True, 这个字段在表中必须有唯一值,默认值是False。
    db_index若值为True, 则在表中会为此字段创建索引,默认值是False。
    db_column字段的名称,如果未指定,则使用属性的名称。
    null如果为True,表示允许为空,默认值是False。
    blank如果为True,则该字段允许为空白,默认值是False。

查询

  • 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询。

    函数名功能返回值说明
    get返回表中满足条件的一条且只能有一条数据。返回值是一个模型类对象。参数中写查询条件。1) 如果查到多条数据,则抛异常MultipleObjectsReturned。2)查询不到数据,则抛异常:DoesNotExist。
    all返回模型类对应表格中的所有数据。返回值是QuerySet类型查询集
    filter返回满足条件的数据。返回值是QuerySet类型参数写查询条件。
    exclude返回不满足条件的数据。返回值是QuerySet类型参数写查询条件。
    order_by对查询结果进行排序。返回值是QuerySet类型参数中写根据哪些字段进行排序。
  • 示范

    a)判等 条件名:exact。
    例:查询编号为1的图书。
    BookInfo.objects.get(id=1)
    
    b)模糊查询
    例:查询书名包含'传'的图书。contains
    BookInfo.objects.filter(btitle__contains='传')
    例:查询书名以'部'结尾的图书 endswith 开头:startswith
    BookInfo.objects.filter(btitle__endswith='部')
    
    c)空查询 isnull
    例:查询书名不为空的图书。isnull 
    select * from booktest_bookinfo where btitle is not null;
    BookInfo.objects.filter(btitle__isnull=False)
    
    d)范围查询 in
    例:查询id为1或3或5的图书。
    select * from booktest_bookinfo where id in (1,3,5);
    BookInfo.objects.filter(id__in = [1,3,5])
    
    e)比较查询 gt(greate than) lt(less  than) gte(equal) 大于等于
    lte 小于等于
    例:查询id大于3的图书。
    Select * from booktest_bookinfo where id>3;
    BookInfo.objects.filter(id__gt=3)
    
    f)日期查询
    例:查询1980年发表的图书。
    BookInfo.objects.filter(bpub_date__year=1980)
    
    例:查询1980年1月1日后发表的图书。
    from datetime import date
    BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
    
    exclude方法示例:
    例:查询id不为3的图书信息。
    BookInfo.objects.exclude(id=3)
    
    order_by方法示例:
    作用:进行查询结果进行排序。
    例:查询所有图书的信息,按照id从小到大进行排序。
    BookInfo.objects.all().order_by('id')
    
    例:查询所有图书的信息,按照id从大到小进行排序。
    BookInfo.objects.all().order_by('-id')
    
    例:把id大于3的图书信息按阅读量从大到小排序显示。BookInfo.objects.filter(id__gt=3).order_by('-bread')
    
F对象
  • **作用:**用于类属性之间的比较

  • 它被定义在django.db.models包里面,使用前要先导入

    from django.db.models import F
    
  • F对象的使用

    # 例:查询图书阅读量大于评论量图书信息。
    BookInfo.objects.filter(bread__gt=F('bcomment'))
    
    # 例:查询图书阅读量大于2倍评论量图书信息。
    BookInfo.objects.filter(bread__gt=F('bcomment')*2)
    
Q对象
  • **作用:**用于查询时条件之间的逻辑关系。not and or,可以对Q对象进行&|~操作

  • 同样使用前先导入

    from django.db.models import Q
    
  • Q对象的使用

    # 例:查询id大于3且阅读量大于30的图书的信息。
    BookInfo.objects.filter(id__gt=3, bread__gt=30)
    BookInfo.objects.filter(Q(id__gt=3)&Q(bread__gt=30))
    
    # 例:查询id大于3或者阅读量大于30的图书的信息。
    BookInfo.objects.filter(Q(id__gt=3)|Q(bread__gt=30))
    
    # 例:查询id不等于3图书的信息。
    BookInfo.objects.filter(~Q(id=3))
    
聚合函数
  • **作用:**对查询结果进行聚合操作

  • 使用aggregate()过滤器调用聚合函数。聚合函数包括:AvgCountMaxMinSum,被定义在django.db.models中,使用前要先导入聚合类

    from django.db.models import Sum,Count,Max,Min,Avg
    
aggregate
  • 调用这个函数来使用聚合。 返回值是一个字典

    # 例:查询所有图书阅读量的总和。
    BookInfo.objects.aggregate(Sum('bread'))
    # 返回
    {'bread__sum': 126}
    
    
count函数
  • 作用:统计满足条件数据的数目

  • 返回的是一个数字

    # 例:统计所有图书的数目。
    BookInfo.objects.all().count()
    BookInfo.objects.count()
    
    # 例:统计id大于3的所有图书的数目。
    BookInfo.objects.filter(id__gt=3).count()
    
    
查询集
  • 查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。
  • 两大特性:
    • 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
    • 缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。

模型类关系

  • ForeignKey:一对多,将字段定义在多的一端中

    例:图书类-英雄类 
    models.ForeignKey() 定义在多的类中
    
    
  • ManyToManyField:多对多,将字段定义在任意一端中

    例:新闻类-新闻类型类 体育新闻 国际新闻
    models.ManyToManyField() 定义在哪个类中都可以
    
    
  • OneToOneField :一对一,将字段定义在任意一端中

    例:员工基本信息类-员工详细信息类. 员工工号
    models.OneToOneField定义在哪个类中都可以
    
    

关联查询

  • 由一类的对象查询多类的时候:
    • 一类的对象.多类名小写_set.all() #查询所用数据
  • 由多类的对象查询一类的时候:
    • 多类的对象.关联属性 #查询多类的对象对应的一类的对象
  • 由多类的对象查询一类对象的id时候:
    • 多类的对象. 关联属性_id
# 例:查询id为1的图书关联的英雄的信息。
	b=BookInfo.objects.get(id=1)
	b.heroinfo_set.all()
# 通过模型类查询:
	HeroInfo.objects.filter(hbook__id=1)

# 例:查询id为1的英雄关联的图书信息。
	h = HeroInfo.objects.get(id=1)
	h.hbook
# 通过模型类查询:
	BookInfo.objects.filter(heroinfo__id=1)

模型类实现关联查询
  • 通过多类的条件查询一类的数据:

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

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

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

  • 注意:

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

模型管理器

  • 管理器是Django的模型进行数据库操作的接口,Django应用的每个模型类都拥有至少一个管理器。Django支持自定义管理器类,继承自models.Manager
自定义管理器
    1. 自定义一个管理器类,这个类继承models.Manger类。
    1. 再在具体的模型类里定义一个自定义管理器类的对象。
应用场景
  • 1.修改原始查询集,重写all()方法
  • 在管理器类中定义创建对象的方法

元选项

  • 在模型类中定义类Meta,用于设置元信息,如使用db_table自定义表的名字。

END…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值