Django教程

Django ORM详解

ORM ----- Object-Relational Mapping 关系对象映射

模型类跟表的关系:

类名称 -> 表名

属性 -> 字段

对象 -> 记录

优点:

1.不用手写sql语句,减低了操作难度。

2.不用关心操作的是什么数据库。

缺点:

因为要进行数据转换,会有性能损失。

备注:

在实际开发中,一般不会使用sql直接操作数据库。而是选用一款orm框架。

防止sql注入。

 

ORM常用命令:

from datetime import date

import os
import sys
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pc.settings.dev")

import django
django.setup()

from pycharm.models import Contents
from type.models import Type
 
# #=============,增加数据
# #- 1.创建名为西游记的图书,添加到数据库中
# #1、通过模型类对象来创建
# content = Contents(
#     title='python基础内容7',
#     type = Type.objects.get(typeid=1),
#     short_title='python基础内容7',
#     keys='python基础内容7',
#     description='python基础内容7',
#     body='python基础内容7',
# )
# content.save()


#- 2.创建内容,并关联栏目,添加到数据库中
#2、通过objects管理器的create方法创建
# Contents.objects.create(
#     title='python基础内容8',
#     type = Type.objects.get(typeid=3), # 不能用filter
#     short_title='python基础内容8',
#     keys='python基础内容8',
#     description='python基础内容8',
#     body='python基础内容8',
# )



#=================,修改数据
#- 1.修改栏目
#1、先获取该数据,通读获取的对象进行修改
# type = Type.objects.get(tname='python基础学习') # 不能用filter
# type.tname = 'python基础'
# type.save()

#- 2.修改内容
#2、通过ojectsupdate方法
# Contents.objects.filter(title='python基础内容77').update(title="python基础内容7")  #不能用get



#=================,删除数据
#- 1.删除编号为10内容
#1、先查找,在删除
# content = Contents.objects.filter(id=11) #可以用get
# content.delete()
#2、用objects对象的delete方法
# Contents.objects.get(title="python基础内容89").delete() # 可以用filter



#==================,查询数据
#- =====基本=====
# - 1.查询编号为2的栏目 [二种方式]
# type = Type.objects.get(typeid=2)
# type = Type.objects.get(pk=2) #pk表示主键
# print(type.tkeys)

# - 2.查询所有栏目
# types = Type.objects.all()
# for type in types:
#     print(type.tname)

# - 3.查询所有栏目的数量
# types = Type.objects.count()
# print(types)



#- ===过滤查询====
# - 1.查询栏目中包含python的栏目[开头,结尾]
# where btitle like "%python%"
#包含tname__contains="python"
# types = Type.objects.filter(tname__contains="Python") # 区分大小写
# for type in types:
#     print(type.tname)

#开头匹配
# where tname like "python%"
# types = Type.objects.filter(tname__startswith='Python')
# for type in types:
#     print(type.tname)

#结尾匹配
# where btitle like "%函数"
# types = Type.objects.filter(tname__endswith='例子')
# for type in types:
#     print(type.tname)

 

# 查询条件符合的总数目

# count = Type.objects.filter(tname__endswith='例子').count()
#     print(count)  # 返回符合条件的总数目


# - 2.查询栏目名不为空的栏目
# types = Type.objects.filter(tname__isnull=False)
# for type in types:
#     print(type.tname)

# - 3.查询栏目编号为1,3,5的栏目
# types = Type.objects.filter(pk__in=[1,3,5])
# for type in types:
#     print(type.tname)
#
# # - 4.查询编号大于3的栏目
# types = Type.objects.filter(typeid__gt=3)  # gt=greater than 大于
# for type in types:
#     print(type.tname)
#
# # - 5.查询编号大于等于3的栏目
# types = Type.objects.filter(typeid__gte=3)  # e =equal 等于
# for type in types:
#     print(type.tname)
#
# # - 6.查询编号不等于3的栏目
# #orm里面条件判断是没有!=这个条件的
# types = Type.objects.exclude(typeid=3)  # exclude:不包含
# for type in types:
#     print(type.tname)
#
# # - 7.查询
# contents = Contents.objects.filter(pub_date__year=2020) #查询2020年创建的内容
# contents = Contents.objects.filter(pub_date__month=2) # 查询2月份创建的数据
# contents = Contents.objects.filter(pub_date__day=20) # 查询20号创建的数据
# contents = Contents.objects.filter(pub_date__week_day=4) # 查询星期四创建的数据
# for content in contents:
#     print(content.title)
#
# # - 8.查询202011号之后发表的内容
# contents = Contents.objects.filter(pub_date__gt=date(2020, 1, 1))
# for content in contents:
#     print(content.title)
#
#
#
# #- ===========FQ对象============
from django.db.models import F, Sum, Max
from django.db.models import Q
# - 1.查询栏目type大于等于id的内容
# contents = Contents.objects.filter(type__gte=F('id'))
# for content in contents:
#     print(content.title)

# # - 2.查询id大于等于2type的内容
# contents = Contents.objects.filter(id__gte=F('type')*2)
# for content in contents:
#     print(content.title)
#
# # - 3.查询type大于2,并且编号小于6的内容
# #1 filte(,)
# contents = Contents.objects.filter(type__gt=2, id__lt=6)
# #2filte(Q)
# contents = Contents.objects.filter(Q(type__gt=2) & Q(type__gte=5))
# for content in contents:
#     print(content.title)
#
# # - 4.查询type大于2,或id小于4的内容,或只能使用Q对象实现
# contents = Contents.objects.filter(Q(type__gt=2) | Q(id__lt=4))
# for content in contents:
#     print(content.title)
#
# # - 5.查询id不等于3的图书,使用Q对象实现
# #1exclude
# contents = Contents.objects.exclude(id=3)
# #2~Q()
# contents = Contents.objects.filter(~Q(id=3))
# for content in contents:
#     print(content.title)
#
#
#
#
#
# #- ============聚合查询====
# # - 1.查询所有id的总和
# #select count(bread) from table
# contents = Contents.objects.aggregate(Sum('id'))  #aggregate 总计,合计
# print(contents['id__sum'])  # contents是一个字典{'id__sum': Decimal('63')}   Decimal十进制的
#
# # - 2.查询最大的id
# contents = Contents.objects.aggregate(Max('id'))
# print(contents['id__max'])
#
# # - 3.查询所有内容,按照id排序,升序[降序]
# #select * from table order by bread asc (desc)
# #升序排序
# contents = Contents.objects.order_by('-id')  #降序是-id
# for content in contents:
    # print(content.id,content.title)
#
#
#
#
#
#
# #- ================关联==============
# # - 1.查询栏目为2中的所有的内容
# #1、先查询出编号为2的栏目的对象
# type = Type.objects.get(pk=3)
# #查询的对象.相关联的模型类小写_set
# content = type.contents_set.all()
# for con in content:
#     print(con.title)
#
# - 2.查询栏目名称为 Python基础 的所有的内容
# type = Type.objects.get(tname='Python函数')
# content = type.contents_set.all()
# for con in content:
#     print(con.title)
#
# # - 3.查询内容编号为3所属的栏目名字
# #1查询内容编号为3的数据
# content = Contents.objects.get(id=2)
# # #2Contents.模型类的外间对象Type
# type = content.type.tname
# print(type)
#
#
#
#
#
# # =========关联过滤查询==========
# # - 1.查询有 python基础内容8 的栏目(distinct()去掉重复)
# type = Type.objects.filter(contents__title='python基础内容8').distinct() 
# type = Type.objects.filter(contents__title__contains='内容4').distinct()
# print(type)
#
# # - 2.查询内容中包含'内容3'的栏目
# types = Type.objects.filter(contents__title__contains='内容3')
# for type in types:
#     print(type.tname)

#
# # - 3.查询栏目typeid大于2的所以内容
# contents = Contents.objects.filter(type__typeid__gt=2)
# contents = Contents.objects.filter(type__typeid__gt=2)[0:3] #限制查询
# for content in contents:
#     print(content.title)

 

Contents模型

图片2.png

 

Type模型

图片3.png 

 

 

 

 

 

Type数据:

图片4.png 

Contents数据:

图片5.png

最后修改:2021-07-01 00:31:43