ORM 常用字段
对象关系映射(object relation mapping),跟数据库里库、表、字段,省去了写sql语句的麻烦,把这些sql语都封装成了ORM方法
优点: 方便、不需要去关心sql语句如何写
缺点: 比sql语句执行慢
官方网站: https://docs.djangoproject.com/zh-hans/2.2/ref/models/fields/
CharField() 字符串
对应mysql的varchar
varchar跟据字符长分配存储空间, 读取速度慢
char 固定长,读取速度快,占用空间
CharField有一个必填参数:
max_length
最大长度
IntegerField 整型
范围-2147483648-2147483647
数量、评论次数、浏览次数
DecimalField 带固定精度的十进制数
有两个必需的参数:
-
max_digits
号码中允许的最大位数。请注意,此数字必须大于
decimal_places
。 -
decimal_places
与数字一起存储的小数位数。
如果参与计算,需要转成浮点数(float)
FloatField 浮点数
ImageField 图片字段
里面写了上传图片的方法,不需要自己写上传代码了。ImageField自动把图片写入到django后台指定的目录下,使用upload_to这个参数来指定上传位置
upload_to 上传图片时指定位置
DateField 日期字段
datetime.date
不指定参数时,每一次创建都必须填写, 不可以为空
指定参数以后,可以默认:
auto_now: 第一次操作这一行数据时自动更新当前到表中
auto_now_add: 第一次创建时保存的时间,以后操作不会发生变化
DateTimeField 日期时间字段
datetime.datetime
不指定参数时,每一次创建都必须填写, 不可以为空
指定参数以后,可以默认:
auto_now: 第一次操作这一行数据时自动更新当前到表中
auto_now_add: 第一次创建时保存的时间,以后操作不会发生变化
BooleanField 布尔类型
真值和假值 0 和 1
判断状态时使用
用户是否激活
商品是否删除
EmailField 邮箱字段
带邮箱正则验证的。自动判断邮箱 的格式
TextField 大文本字段
编辑新闻、小说网站, 商品详情介绍
字段选项
null
允许数据库字段为空
blank
为True时,模版当中的表单验证允许为空。
choice
class User(models.Model):
"""
用户名、密码、邮箱、手机号
"""
SEX_CHOICE = (
(0, '男'),
(1, '女')
)
username = models.CharField(max_length=64, unique=True, verbose_name='用户名')
password = models.CharField(max_length=128, blank=True)
email = models.EmailField(max_length=64, null=True)
sex = models.IntegerField(choices=SEX_CHOICE, default=0)
default
默认值,为当前列添加一个默认值,用户不需要在前端输入。
primary_key
设置为主键
unique 唯一
verbose_name
把该属性在admin当中变为一个可读名称
Meta选项
是djangoOrm内部的一个类,为orm提供一些操作
abstract
抽象基类
可复用的,共有的, abstract为True时,可以继承使用
from django.db import models
# Create your models here.
"""
网站当中,分模块开发
用户
用户信息、收货地址、其它信息、订单信息、积分信息
如商城:
商品模块
分类、品牌、商品信息
如新闻网站:
新闻模块
分类、新闻信息
"""
class BaseModel(models.Model):
create_time = models.DateTimeField(auto_now_add=True)
update_time = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class User(BaseModel):
"""
用户名、密码、邮箱、手机号
"""
SEX_CHOICE = (
(0, '男'),
(1, '女')
)
username = models.CharField(max_length=64, unique=True, verbose_name='用户名')
password = models.CharField(max_length=128, blank=True)
email = models.EmailField(max_length=64, null=True)
sex = models.IntegerField(choices=SEX_CHOICE, default=0)
class Goods(BaseModel):
"""
商品名称、价格、商品详情介绍,上市日期,是否删除, 库存
"""
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
desc = models.TextField()
public_date = models.DateTimeField(auto_now_add=True) # 添加日期为发布时期
is_delete = models.BooleanField(default=True)
stock = models.IntegerField(default=0)
db_table
为表名进行重命名
ordering
指定表的默认排序规则
verbose_name
在admin中表的显示名称
verbose_name_plural
去掉对象的复数, 也就是admin当中显示时的s
ORM的操作
增加
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 创建用户
"""
使用create进行创建
"""
# 表名.objects
User.objects.create(username='lisi', password='123', email='123@qq.com')
查询
查询所有的
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 查询所有的用户
# all()
user = User.objects.all()
print(user)
查询单个
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 查询单个
# get() 查询不到时,会抛出异常, User.DoesNotExist
try:
user = User.objects.get(username='zhangsan1')
except User.DoesNotExist:
print('用户未找到')
else:
print(user)
查询符合条件的
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 查询符合条件的
# filter() 括号中间入查询条件
# filter() 条件为空时,查询所有
# filter(name=name)
# filter 查询出来的结果是一个queryset列表
# filter() 查询不到满足条件的数据时,不会抛出异常,返回空列表
user_list = User.objects.filter(username='zhangsan1')
print(user_list)
获取查询结果的第一条数据 first()
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 获取查询结果的第一条数据
# first()
user = User.objects.filter(username='zhangsan1').first()
print(user)
# first() 获取不到数据时,是否会报错?
# 答: 不会, 返回None
if user:
print('用户已存在')
else:
print('可以添加用户')
"""
登录为例
如果用户存在,进行密码比对
否则告诉用户,用户名或者密码不正确
注册为例
如果用户存在,返回用户名已注册
否则进行注册操作
"""
获取查询结果的最的一条数据
last()
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 获取查询结果的最后一条数据
# last()
user = User.objects.filter(username='zhangsan1').last()
print(user)
获取条件之外的数据
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 获取条件之外的数据
user = User.objects.exclude(username='zhangsan')
print(user)
统计查询结果的数量
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 统计查询结果的个数
print(User.objects.all().count())
Q语句 F语句
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
# 统计查询结果的个数
# print(User.objects.all().count())
from django.db.models import Q
print(User.objects.filter(Q(username='zhangsan') & Q(sex=1)))
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day06.settings')
import django
django.setup()
# 在这个文件中测试orm的操作,并且可以保存下来的我的操作记录
# 导入模型
from app01.models import User, Goods
from django.db.models import Q, F
#
# print(User.objects.filter(Q(username='zhangsan') & Q(sex=1)))
# 使用F语句为所有人的年龄加1
User.objects.update(age=F('age')+1)