Django框架——模型(数据库操作)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架——模型(数据库操作)相关的知识,希望对你有一定的参考价值。

-- models.py

-- ORM(object-relation mapping) 实现数据模型与数据库的解耦;

# 对象,关系,映射;

1.根 据对象的类型生成表结构;

2.将对象、列表的操作,转换为sql语句;

3.将sql查询到的结果转换为对象、列表;


-- 字段类型

# 所有字段类型被定义在django.db.models.fields目录下,

# 方便使用,被导入到django.db.models中;

1.AutoField 自动增长 # 通常不用指定

2.BooleanField 布尔类型

3.NullBooleanField 支持布尔值与null

4.CharField(max_length=长度) 字符串 # 必须指定最大长度

5.TextFeild 大文本字段

6.IntegerField 整数

7.DecimalField(max_digits=None,decimal_places=None) # 浮点数,总位数,小数位数

8.DateField([auto_now=False, auto_now_add=False]) # 保存对象时间;创建对象时间;

9.TimeField 时间 # 同DateField

10.DateTimeField 日期时间 # 同DateField

11.FileField 上传文件时间

12.ImageField # 继承与FileField,对上传内容进行校验

13.BigIntegerField 64位整数

14.SmallIntegerField

-- 字段命名限制

1.非python保留字

2.不能有连续下划线,查询中有;


-- 字段选项(数据库中的约束)

1.null 

2.blank

3.db_column  # 自定义字段名

4.db_index

5.default

6.primary_key

7.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_length=20)
# bpub_date = models.DateTimeField()
# bread = models.IntegerField(default=0)
# bcomment = models.IntegerField(default=0)
# isDelete = models.BooleanField(default=False)
# class Meta:
# db_table = ‘bookinfo‘
# class HeroInfo(models.Model):
# hname = models.CharField(max_length=20)
# hgender = models.BooleanField(default=True)
# isDelete = models.BooleanField(default=False)
# hcontent = models.CharField(max_length=100)
# 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方法
# 级联删除  
user=models.ForeignKey(user,blank=True,null=True,on_delete=models.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(isDelete=False)
# 修改父类Manager中的get_queryset()方法,在父类方法后面添加一个filter(isDelete=Fales);
# 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__exact=1)
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__isnull=False)
print(bookinfo7)
# 查询指定编号范围的字段值
bookinfo8 = BookInfo.objects.filter(pk__in=[1,3])
print(bookinfo8)
# 查询大小范围内的字段值
bookinfo9 = BookInfo.objects.filter(id__gt=3)
print(bookinfo9)
# exclude()过滤器
bookinfo10 = BookInfo.objects.exclude(id__gt=3)
print(bookinfo10)


-- 返回单个值的方法

-- get 获取单一对象

bookinfo11 = BookInfo.objects.get(book_title = ‘天龙八部‘)
print(bookinfo11)
# get如果查询的不仅一个对象,会触发MultipleObjectsReturned异常
bookinfo12 = BookInfo.objects.get(id__gt=2)
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__gte=F(‘book_comment‘))
print(bookinfo14)
# 可以在F()对象上使用算数运算
bookinfo15 = BookInfo.objects.filter(book_read__gte=F(‘book_comment‘)*2)
print(bookinfo15)


-- Q对象(query查询)

# 构造查询对象
-- 逻辑与:多个过滤器逐个调用
bookinfo16 = BookInfo.objects.filter(book_read__lte=40, id__lte=3)
print(bookinfo16)
bookinfo17 = BookInfo.objects.filter(book_read__lte=40).filter(id__lte=3)
print(bookinfo17)
-- 利用Q对象实现,或与非
-- 基本语法
Q(属性名__运算符=值)
# &表示逻辑与,|表示逻辑或
bookinfo18 = BookInfo.objects.filter(Q(book_read__lte=40) & Q(id__lte=3))
print(bookinfo18)
bookinfo19 = BookInfo.objects.filter(Q(book_read__lte=40) | Q(id__lte=3))
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(id=1)
2.获取对应所有所有对象信息
object2 = object1.小写表名_set.all()
# heroes = book.heroinfo_set.all()

-- 多对一,多类

1.获取单一字段对象
object1 = 表名.objects.get(‘条件‘)
# hero = HeroInfo.objects.get(id=1)
2.获取对应对象信息
object1.字段属性
# hero.hero_book

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

# 暂略


-- 自关联

# 略


以上是关于Django框架——模型(数据库操作)的主要内容,如果未能解决你的问题,请参考以下文章

Django框架——模型(数据库操作)

Django 07. django框架模型之增删改查基本操作

django框架的模型类定义及操作

Django框架:设计模型

Django之ORM框架的使用

WEB框架Django之ORM操作