1.模型类字段
1.1模型类字段及特殊属性
字段 | 属性 |
---|---|
BoolendField | 布尔类型,值为:True/False,默认为:None |
CharField | 字符串类型,必须设置字符的最大长度max_length=None |
IntegerField | 整型类型 |
DateField | 日期类型 |
DatetimeField | 日期时间类型 |
DecimalField | 十进制浮点数类型,必须写中位数max_digits和小数位数decimal_places |
float | 浮点型 |
2.字段属性
2.1 字段通用属性
属性 | 含义 |
---|---|
null | 默认值为False,如果为True,则表示为空 |
blank | 默认值为Fslse,如果为True,则表示允许该字段值为空 |
choices | 分组 |
db_column | 如果没有指定,则使用属性名称 |
db_index | 默认值为:False,如果为True,则为该字段创建索引 |
default | 默认值 |
primary_key | 主键,每一张表里有且只有一个主键 |
unique | 如果为True,则表示这个值在表里是唯一存在的 |
verbose_name | 对于一个字段更高的可读性名称 |
3.模型类元选项
3.1 模型元选项
在模型类里创建模型元选项
class Bookinfo(models.Model):
name = models.CharField(max_length=20,verbose_name='书名')
pub_date = models.DateField(null=True,verbose_name='发布日期')
read_count = models.IntegerField(default=0,verbose_name='阅读量')
comment_count = models.IntegerField(default=0,verbose_name='评论量')
sale_out = models.BooleanField(default=False,verbose_name='售空')
#模型元选项
class Meta:
verbose_name = '书籍信息表'
verbose_name_plural = verbose_name #admin表的名字
db_table = 'bookinfo' #在数据库里表名
def __str__(self): #直接输出对象时,输出对象的名字
return self.name
元选项的含义
元选项 | 含义 |
---|---|
abstract | 抽象基类,不会创建真的表 |
app_label | 描述是哪一个应用 |
db_table | 应用名加模型类名是真正的表明 |
ordering | 排序。“-”是倒序,“ ?”是随机排序 |
verbose_name | 设置表的名称,为单数 |
verbose_name_plural | 表的名称,为复数 |
4.shell工具
在终端运行命令,测试sql语句
在views.py里设置
from books.models import Bookinfo
book = Bookinfo.objects.get(id=1)
在终端运行
python manage.py shell
5.增删改查
5.1 增加数据
create增加
直接在终端运行
Bookinfo.objects.create(
name = 'python高级',
pub_date = '2022-02-02',
read_count = 500,
comment_count=200,
)
save增加
先在views.py里写上代码
book = BookInfo(
name='python',
pub_date='2020-11-11',
read_count=200,
comment_count=100,
sale_out=False,
)
book.save()
再在终端里运行
book.save()
5.2 删除数据
.filter().delete()
直接在终端运行
Bookinfo.objects.filter(name='python').delete()
delete()
先在views.py里写上代码
book = Bookinfo.objects.get(name='python高级')
再在终端里运行
book.delete()
5.3 修改数据
update修改
直接在终端运行
Bookinfo.objects.filter(name='python高级').update(sale_out = True)
get+save()
先在views.py里写上代码
book = Bookinfo.objects.get(name='python') # 获取对象
book.read_count = 300 # 修改属性值
book.save() # 保存生效
再在终端里运行
book.save()
5.4 查找数据
简单的查询
直接用filter过滤出结果或用get直接查找,不过get针对的是一条数据的查找。all这是查询全部内容比如:
# 查询编号为2的图书
Bookinfo.objects.get(id=2)
# 查询书名包含'湖'的图书
book = Bookinfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
book= Bookinfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
book=Bookinfo.objects.filter(name__isnull=True)
多条件查询
# 查询编号为1或3或5的图书
Bookinfo.objects.filter(id__in=[2,4,5])
# 查询编号大于3的图书
# gt > gte >= lt < lte <=
Bookinfo.objects.filter(id__gt=3)
# 查询1980年发表的图书
Bookinfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
Bookinfo.objects.filter(pub_date__gt='1990-01-01')
属性 VS 属性
需要先导入F模块
# 查询阅读量大于等于评论量的图书。
# F 查询字段和字段比较
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')
总结
错误
解决方法
忘记导入模块
代码一个字母写错了