第六单元 初识ORM

模型类字段

BooleanField

True/False 字段,默认值为 None
表单类型:**CheckboxInput**,`<input type='checkbox' ...>`

CharField(字符串字段)

CharField(max_length=None)
# max_length 设置最大的字符数长度限制

DateField(日期类型)

DatetimeField(日期和时间)

DateField(auto_now=False, auto_now_add=False,**options)
'''
auto_now: 该值为 True 时,每次在保存数据对象时,自动设置该字段为当前时间,也可以理解为自动更新最后一次修改时间
auto_now_add: 该值为 True 时,该字段设置在第一次数据对象创建时,可以记录当前字段创建的时间值
`auto_now`,`auto_now_add`,`default`不能同时出现
'''

DecimalField(以Decimal实例表示的十进制浮点数类型)

max_digits: 位数总数,包括小数点后的位数,必须大于 decimal_places 参数
decimal_places: 小数点后的数字数量,精度

FloatField(浮点类型)

IntegerField(整形)

字段属性

null:如果该值为`True`,将在数据库中将控制存储为`NULL`
blank:如果该值为`True`,则在验证时该字段值可以为空;
choices:元组中第一个值为真正在数据库中存储的值,第二个值为该选项的描述
db_column:数据库中用来表示该字段的名称,如果未指定,那么 Django 将会使用`Field`名作为字段名
db_index:当该值为`True`时,为该字段创建索引
default:该字段默认值,可以是一个值或是一个回调函数
primary_key:主键
unique:唯一
verbose_name:字段的名字

模型元选项

class TestTable(models.Model):class Meta:
        ordering = [Fields]
abstract:代表当前模型类为抽象基类,不会创建真正的数据表,只是为了其他模型类继承使用
app_label:当模型类被定义在了其他 app 下,这个属性用来描述当前表属于哪个 app 应用
db_table:当前模型类所对应的表名,未设置时,django 默认将表名与 app 名由下划线组成,作为表名
ordering:当前表中的数据存储时的排序规则,这是一个字段名的字符串,可以是一个列表或元组;
verbose_name:一般设置该表展示时所用的名称,名称被自动处理为复数,字符串后加一个"s"
verbose_name_plural:与`verbose_name`功能相同,但是不会自动在字符串后加"`s`"以表复数

ORM的增删改查

django 自带了一个数据库测试的 shell 工具,这是一个非常方便可以让我们对 django 代码进行测试的环境
可以直接通过`python manage.py shell`命令行管理工具来打开

链式过滤条件

contains:大小写敏感的匹配查询,也是 like,注意转换后查询条件的两侧都有%
icontains:大小写不敏感的匹配查询
range:在某个范围内进行查询Person.objects.filter(id_range=(1,6))
in:查询条件是否在给定的范围内,用小括号和中括号都可以
exact:查找完全一致的内容
iexact:忽略大小写
startswith、endswith:分别匹配开头和结尾,区分大小写
istartswith、iendswith:分别匹配开头和结尾,忽略大小写
gte:大于或等于
lte:小于或等于

实例

# 新增一条数据
Bookinfo.objects.create(
    name='python',
    pub_date='2022-02-22',
    read_count=500,
    comment_count=200,
)
# 方法2
book = Bookinfo(
name='python高级',
    pub_date='2022-02-22',
    read_count=500,
    comment_count=200,
)
book.save()

# 修改
# 方式1
Bookinfo.objects.filter(name='python').update(sale_out=True)
# 方式2
book = Bookinfo.objects.get(name='python高级')
book.read_count = 222
book.save()

# 删除
# 方式1
Bookinfo.objects.filter(name='python').delete()
# 方式2
book = Bookinfo.objects.get(name='python高级')
book.delete()

# 查询所以数据
Bookinfo.objects.all()
# 查询数据数量
Bookinfo.objects.count()
# 获取到准确的一条数据
Bookinfo.objects.get(name='射雕英雄传')
# 过滤出符合要求的所有数据
Bookinfo.objects.filter(name='射雕英雄传')
# 查询
# 查询编号为1的图书
Bookinfo.objects.get(id=1)
# 完整
Bookinfo.objects.get(id__exact=1)
# 查询书名包含'湖'的图书
#   contains 包含
Bookinfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
# endswith  结尾
Bookinfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
Bookinfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
Bookinfo.objects.filter(id__in=[1,3,5])
# 查询编号大于3的图书
Bookinfo.objects.filter(id__gt=3)
# 查询1980年发表的图书
Bookinfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
Bookinfo.objects.filter(pub_date__gte='1990-01-01')

# F查询和Q查询
# 字段与字段比较使用
from django.db.models import F
# 查询阅读量大于等于评论量的图书。
Bookinfo.objects.filter(read_count__gte=F('comment_count'))
# 查询阅读量大于2倍评论量的图书。
Bookinfo.objects.filter(read_count__gte=F('comment_count')*2)

# Q查询
# 查询阅读量大于20,并且编号小于3的图书。
from django.db.models import Q
Bookinfo.objects.filter(read_count__gt=20,id__lt=3)
Bookinfo.objects.filter(read_count__gt=20).filter(id__lt=3)
Bookinfo.objects.filter(Q(read_count__gt=20) &Q (id__lt=3))
# 查询阅读量大于20,或编号小于3的图书。
Bookinfo.objects.filter(Q(read_count__gt=20) |Q (id__lt=3))
# 查询编号不等于3的图书。
Bookinfo.objects.exclude(id=3)
Bookinfo.objects.filter(~Q(id=3))
# 查询图书的总阅读量。
from django.db.models import Sum,Max,Min,Avg,Count
Bookinfo.objects.aggregate(Sum('read_count'))
# 查询图书总数。
Bookinfo.objects.count()
Bookinfo.objects.aggregate(Count('id'))
# 查询所有书籍信息平按照阅读量排序。
# 正序
Bookinfo.objects.all().order_by("read_count")
# 倒序
Bookinfo.objects.all().order_by("-read_count")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值