搜维斯网站建设,上传网站到空间,软件外包服务内容,长沙58同城招聘信息-- models.py-- ORM(object-relation mapping) 实现数据模型与数据库的解耦#xff1b;# 对象#xff0c;关系#xff0c;映射#xff1b;1.根 据对象的类型生成表结构#xff1b;2.将对象、列表的操作#xff0c;转换为sql语句#xff1b;3.将sql查询到的结果转换为对象… -- models.py-- ORM(object-relation mapping) 实现数据模型与数据库的解耦# 对象关系映射1.根 据对象的类型生成表结构2.将对象、列表的操作转换为sql语句3.将sql查询到的结果转换为对象、列表-- 字段类型# 所有字段类型被定义在django.db.models.fields目录下# 方便使用被导入到django.db.models中1.AutoField 自动增长 # 通常不用指定2.BooleanField 布尔类型3.NullBooleanField 支持布尔值与null4.CharField(max_length长度) 字符串 # 必须指定最大长度5.TextFeild 大文本字段6.IntegerField 整数7.DecimalField(max_digitsNone,decimal_placesNone) # 浮点数总位数小数位数8.DateField([auto_nowFalse, auto_now_addFalse]) # 保存对象时间创建对象时间9.TimeField 时间 # 同DateField10.DateTimeField 日期时间 # 同DateField11.FileField 上传文件时间12.ImageField # 继承与FileField,对上传内容进行校验13.BigIntegerField 64位整数14.SmallIntegerField-- 字段命名限制1.非python保留字2.不能有连续下划线查询中有-- 字段选项(数据库中的约束)1.null 2.blank3.db_column # 自定义字段名4.db_index5.default6.primary_key7.unique-- 关系字段类型1.ForeignKey 一对多manufacturer.car_set.all()2.OneToOneField 一对一3.ManyToManyField 多对多-- 元选项# 创建模型类之后自定义表名
class Meta:
自定义表名
db_table bookinfo
# 在生成迁移之后的0001——initial.py文件中多处一个
# option{
db_table:bookinfo
# 表示表的名字已经被自定义了
# 默认生成的表的名字是:应用名_小写的模型类名
# 如booktest_heroinfo;
}
# 表示当前不是模型类模型不会被用来创建所有数据表
class Meta:
表示当前类不是模型类,而是其他模型的抽象基类
abstract True
# 继承模型类调用其方法-- 测试数据# class BookInfo(models.Model):
# btitle models.CharField(max_length20)
# bpub_date models.DateTimeField()
# bread models.IntegerField(default0)
# bcomment models.IntegerField(default0)
# isDelete models.BooleanField(defaultFalse)
# class Meta:
# db_table bookinfo
# class HeroInfo(models.Model):
# hname models.CharField(max_length20)
# hgender models.BooleanField(defaultTrue)
# isDelete models.BooleanField(defaultFalse)
# hcontent models.CharField(max_length100)
# hbook models.ForeignKey(BookInfo)
# insert into bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
# (射雕英雄传,1980-5-1,12,34,0),
# (天龙八部,1986-7-24,36,40,0),
# (笑傲江湖,1995-12-24,20,80,0),
# (雪山飞狐,1987-11-11,58,24,0);
# insert into model_heroinfo(hname,hgender,hbook_id,hcontent,isDelete) values
# (郭靖,1,1,降龙十八掌,0),
# (黄蓉,0,1,打狗棍法,0),
# (黄药师,1,1,弹指神通,0),
# (欧阳锋,1,1,蛤蟆功,0),
# (梅超风,0,1,九阴白骨爪,0),
# (乔峰,1,2,降龙十八掌,0),
# (段誉,1,2,六脉神剑,0),
# (虚竹,1,2,天山六阳掌,0),
# (王语嫣,0,2,神仙姐姐,0),
# (令狐冲,1,3,独孤九剑,0),
# (任盈盈,0,3,弹琴,0),
# (岳不群,1,3,华山剑法,0),
# (东方不败,0,3,葵花宝典,0),
# (胡斐,1,4,胡家刀法,0),
# (苗若兰,0,4,黄衣,0),
# (程灵素,0,4,医术,0),
# (袁紫衣,0,4,六合拳,0);-- 模型类方法1.str方法
# 返回模型类对象的描述
2.save方法
# 将对象保存至数据库
3.delete方法
# 级联删除
usermodels.ForeignKey(user,blankTrue,nullTrue,on_deletemodels.SET_NULL)
# 没看懂-- 管理器(模型的成员)# 模型类的属性将对象与数据表映射-- 类的属性# objects是Manager类型的对象django中定义好的类用于数据库的交互
# 如果没有指定默认提供一个管理器objects;-- 修改管理器名称(默认objects)# models.py文件中
from django.db import models
class Person(models.Model):
# 这个模型类里面有一个属性叫做person
person models.Mangager()
# 在Manager()类中完成字段信息的映射-- 自定义管理器# 默认管理器方法太少可以通过自定义管理器来新增方法-- 修改管理器返回的原始查询集class BookInfoManager(models.Manager):
def get_queryset(self):
return super(BookInfoManager, self).get_queryset().filter(isDeleteFalse)
# 修改父类Manager中的get_queryset()方法在父类方法后面添加一个filter(isDeleteFales);
# super(BookInfoManager, self).get_queryset()表示父类的方法class BookInfo(models.Model):
... 字段赋值
books1 BookInfoManger() # 表示重写父类后重新定义给新的管理器-- 向管理器类中添加额外的方法# 模型类中无法再使用__init__方法因为父类已经使用创建了很多东西
# 所以我们通过在模型类中使用类方法
classmethod
def create(cls, btitle, bpub_date):
b BookInfo
b.btitle btitle
...
return b
或者
在自定义管理器中添加上面的方法(推荐使用)-- 查询-- 获取所有对象object1 表名.objects.all()
# bookinfo BookInfo.objects.all()
# 可以通过切片选择范围内对象(限制查询集合)
object2 表名.objects.all()[1,3]-- 过滤器(查询集的方法)-- 条件查询1.filter() # 满足查询始终返回一个查询集列表
2.exclude() # 不满足查询
3.order_by()
4.values()
5.all()-- 语法规则# 表名.objects.filter(字段名__运算符判断值)-- 运算符1.exact # 精确匹配
2.contains # 包含
3.startswith # 以指定值开头
4.endswith # 以指定值结束
5.isnull # 不为空
6.in # 范围内查询
7.gt/gte/lt/lte
# 运算符前加上i不区分大小写-- 例子 # filter()过滤器
# 精确查询
bookinfo_3 BookInfo.objects.filter(id__exact1)
print(bookinfo_3)
# 包含查询
bookinfo4 BookInfo.objects.filter(book_title__contains八)
print(bookinfo4)
# 首字查询
bookinfo5 BookInfo.objects.filter(book_title__startswith天)
print(bookinfo5)
# 尾字查询
bookinfo6 BookInfo.objects.filter(book_title__endswith传)
print(bookinfo6)
# 查看不为空的字段值
bookinfo7 BookInfo.objects.filter(book_title__isnullFalse)
print(bookinfo7)
# 查询指定编号范围的字段值
bookinfo8 BookInfo.objects.filter(pk__in[1,3])
print(bookinfo8)
# 查询大小范围内的字段值
bookinfo9 BookInfo.objects.filter(id__gt3)
print(bookinfo9)
# exclude()过滤器
bookinfo10 BookInfo.objects.exclude(id__gt3)
print(bookinfo10)-- 返回单个值的方法-- get 获取单一对象bookinfo11 BookInfo.objects.get(book_title 天龙八部)
print(bookinfo11)
# get如果查询的不仅一个对象会触发MultipleObjectsReturned异常
bookinfo12 BookInfo.objects.get(id__gt2)
print(bookinfo12)
# get如果查询不到对象会触发DoesNotExist异常
bookinfo13 BookInfo.objects.get(book_title 天龙七部)
print(bookinfo13)
-- count()
-- first()
-- last()
-- exists()-- F对象和Q对象# 需要导入模块中的对象from django.db.models import F, Q-- F对象# 实现两个属性之间的比较
bookinfo14 BookInfo.objects.filter(book_read__gteF(book_comment))
print(bookinfo14)
# 可以在F()对象上使用算数运算
bookinfo15 BookInfo.objects.filter(book_read__gteF(book_comment)*2)
print(bookinfo15)-- Q对象(query查询)# 构造查询对象
-- 逻辑与多个过滤器逐个调用
bookinfo16 BookInfo.objects.filter(book_read__lte40, id__lte3)
print(bookinfo16)
bookinfo17 BookInfo.objects.filter(book_read__lte40).filter(id__lte3)
print(bookinfo17)
-- 利用Q对象实现或与非
-- 基本语法
Q(属性名__运算符值)
# 表示逻辑与|表示逻辑或
bookinfo18 BookInfo.objects.filter(Q(book_read__lte40) Q(id__lte3))
print(bookinfo18)
bookinfo19 BookInfo.objects.filter(Q(book_read__lte40) | Q(id__lte3))
print(bookinfo19)-- 聚合函数# 需要导入模块
from django.db.models import *
表名.objects.aggregate(Sum(字段名))
1.Avg
2.Count
# 查询总数的时候一般不使用
# BookInfo.objects.count() 替代
3.Max
4.Min
5.Sum
bookinfo20 BookInfo.objects.aggregate(Sum(book_read))
print(bookinfo20)-- 关联查询-- 一对多,一类1.获取单一字段对象
object1 表名.objects.get(条件)
# book BookInfo.objects.get(id1)
2.获取对应所有所有对象信息
object2 object1.小写表名_set.all()
# heroes book.heroinfo_set.all()-- 多对一多类1.获取单一字段对象
object1 表名.objects.get(条件)
# hero HeroInfo.objects.get(id1)
2.获取对应对象信息
object1.字段属性
# hero.hero_book-- 通过模型类实现关联查询# 暂略-- 自关联# 略 转载于:https://blog.51cto.com/13269293/1971208