Django ORM映射

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)
给个关注呗,同学,想要想要!!!
上一篇:laravel orm


下一篇:【初学菜鸟作-nginx网站服务器的安装以及基本使用】