4. 模型的增删改查(ORM模块)
4.1数据的查询
4.1.1 查询所有的数据
查询多条语句
from user.models import UserInfo
data = UserInfo.objects.all()
data
就是得到的数据
4.1.2 按照指定条件查询
def get(self, *args, **kwargs):
"""
Performs the query and returns a single object matching the given
keyword arguments.
"""
4.1.3 计数语句
data = UserInfo.objects.count()
print(data)
4.1.4 符合条件的多条数据查询
-
比较查询
# 1. 比较查询 大于gt greater then data = UserInfo.objects.filter(id__gt = 1) # 2. id 大于等于3 gte data = UserInfo.objects.filter(id__gte = 3) # 3. id 小于1的人 data = UserInfo.objects.filter(id__lt = 1) # 4. id 小于等于1的人 lte data = UserInfo.objects.filter(id__lte = 1)
注意点:
filter
既可以查询一条语句,也可以查询多条语句- 但是查询的结果放在一个列表里面
- 如果查询不到任何满足条件的数据,则返回的是一个空列表
-
模糊查询
# 查询名字中带有 王 的人 data = UserInfo.objects.filter(name__contains='王') # 查找姓 王 的人 data = UserInfo.objects.filter(name__startswitch='王')
4.1.5 关于外键的查询
# 获取所有的数据
UserInfo.objects.all()
# 获取外键
add.userinfo_set.all()
4.2 数据的增加
4.2.1 第一种方式
通过创建对象,进行属性设置,最后再保存的方式
# 利用python的思维
>>> from book.models import BookInfo,PersonInfo
>>> book1 = BookInfo(bookname='红楼梦',publictime='2016-12-1')
>>> book1.save()
>>> book1
<BookInfo: 红楼梦>
4.2.2 第二种方式(重点)
# 利用sql的思维
BookInfo.objects.create(bookname='三国演义',publictime='2010-1-1')
# 相当于 sql语句
insert into bookinfo(bookname,publictime) values('三国演义','2010-1-1')
注意:自动保存
4.3 数据的修改
修改
>>> book2 = BookInfo.objects.get(pk=3)
>>> book2
<BookInfo: 三国演义>
>>> book2.publictime='1973-1-1'
>>> book2.save()
>>> BookInfo.objects.filter(bookname='三国演义').update(publictime='1973-10-1')
1
返回
4.4 关于数据库表名的设计
如果没有指定数据库的表名,会以 应用名_模型类名
的小写作为数据库的表名
设计数据库表名:
在模型类的内部进行表的设计
class BookInfo(models.Model):
# 图书名
bookname = models.CharField(verbose_name='书籍名字',max_length=30)
# 出版时间
publictime = models.DateField(verbose_name='出版时间',null=True)
'''
auto_now=False :表示每次保存对象是,自动设置该字段为当前时间,用于做最后一次修改的时间戳
auto_now_add=False:表示当前对象,第一次被创建时,自动设置当前时间,用于创建的时间戳
当前两个参数时相互排斥的
null: 允许为空
'''
# 阅读量
count = models.IntegerField(verbose_name='阅读量',default=0)
# 销量
seltcount = models.IntegerField(verbose_name='销量',default=0)
# 逻辑删除
is_delete = models.BooleanField(verbose_name='逻辑删除',default=False)
class Meta:
# 制定数据的表名
db_table = 'bookinfo'
#修改后台站点中,数据库表的名字
verbose_name = '书籍'
# 去除后台管理站点中,名字的中的s
verbose_name_plural = verbose_name
注意:修改数据库的表名需要迁移
4.5 关于模型与数据库数据的关系
# 测试的时候,需要将使用到的模型导入
>>> from book.models import BookInfo
# 数据库的一条数据,其实就是模型类的一个实例
# 通过给实例的属性进行赋值的操作,完成数据库字段值的设置
>>> book1 = BookInfo(bookname='红楼梦',publictime='2016-12-1')
>>> book1.save()
>>> book1
<BookInfo: 红楼梦>
注意点:实例完成属性的设置之后,需要保存
4.6 关于orm模型设置数据类型
Field
类
def __init__(self, verbose_name=None, name=None, primary_key=False,
max_length=None, unique=False, blank=False, null=False,
db_index=False, rel=None, default=NOT_PROVIDED, editable=True,
serialize=True, unique_for_date=None, unique_for_month=None,
unique_for_year=None, choices=None, help_text='', db_column=None,
db_tablespace=None, auto_created=False, validators=(),
error_messages=None):
verbose_name
:起别名primary_key
:主键null
:允许为空,默认为False 非空blank
:字段允许为空白,表单验证db_column
:字段名称,没有指定的话,使用属性的名字db_index
:给该字段设置索引unique
:说明该字段在这个表里具有唯一值defalut
:设置默认值
4.7 模型的相关字段
Field | 描述 |
---|---|
AutoField() | 如果不指定,则Django自动指定属性名为id的自增长属性,一般不指定 |
booleanField() | 布尔值,True,False |
NullBooleanField() | True,False,null |
TextField() | 大文本字段,字符在4000以上 |
DecimalField(max_digits=总位数,decimal_places=小数位数) | 十进制浮点数 |
DateField() | 表示日期 |
TimeField() | 表示时间 |
DateTimeField() | 表示日期时间 |
FileField() | 上传的文件的字段 |
ImageField() | 对上传的文件进行校验,保证是有效图片 |
描述 | |
---|---|
ForeignKey(obj) | 设置外键 |
# ForeignKey 的属性
def __init__(self, to, on_delete=None, related_name=None, related_query_name=None,
limit_choices_to=None, parent_link=False, to_field=None,
db_constraint=True, **kwargs):
-
to
:给谁创建外键 -
on_delete
:取值 描述 None
删除关联表中的数据时,当前表与其关联的field的行为 models.CASCADE
删除关联数据,与之关联也删除 models.DO_NOTHING
删除关联数据,什么也不做 models.PROTECT
删除关联数据,引发错误ProtectedError models.SET_NULL
删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理) models.SET_DEFAULT
删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理) models.SET
删除关联数据 -
related_name
:该属性可用来解决两张表关联时候,访问属性,可以通过这个值访问。