ORM字段及操作

1. 准备工作

1.1 创建项目
  1. 打开项目的文件夹 - 输入cmd
  2. 创建项目 django-admin startproject 项目名
  3. 创建子应用 python manage.py startapp 子应用名
1.2 配置相关信息

在settings.py 中进行配置

# 注册子应用
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'books', # 注册子应用
]

# 配置模板
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

# 配置数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST':'localhost',
        'POST':3306,
        'USER':'root',
        'PASSWORD':'123123',
        'NAME':'book', # 数据库
    }
}

# 配置汉字,时区
LANGUAGE_CODE = 'zh-Hans'

TIME_ZONE = 'Asia/Shanghai'
1.3 安装数据库

在与项目名的同文件的**init.py**

import pymysql
pymysql.install_as_MySQLdb()  # 安装数据库

2.模型类字段

2.1 模型类字段类型
类型说明表单类型
BooleanField布尔类型,值为True/FalseCheckboxInput,<input type=‘checkbox’ …>
CharField字符串,参数必须有max_length(表示最大字符格式)TextInput,<input type=“text” …>
TextField大文本字段,一般超过4000个字符时使用
IntegerField整数
DecimalField十进制浮点数,更准确,参数max_digits表示总位数,参数decimal_places表示小数位数TextInput,<input type=“text” …>
FloatField浮点数TextInput,<input type=“text” …>
DateField日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误TextInput,<input type=“text” …>
TimeField时间,参数同DateField
DateTimeField日期时间,参数同DateField
FileField上传文件字段
2.2 字段属性
选项说明
null如果为True,表示允许为空,默认时False,数据库
blank如果为True,则该字段允许为空白,默认值是False,表单验证
db_column字段的名称,如果未指定,则使用属性的名称
db_index若值为True, 则在表中会为此字段创建索引,默认值是False
default默认
primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique如果为True, 这个字段在表中必须有唯一值,默认值是False
verbose对于字段的一个可读性更高的名称
2.3 外键

在设置外键时,需通过on_delete选项指明主表删除数据时,对于外键
引用表数据如何处理在django.db.models中包含了可选常量:

  • CASCADE级联,删除主表数据时连通一起删除外键表中数据
  • PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
  • SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
  • SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
2.4 创建图书模型类:
# 书籍模型类
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 = '书籍信息表'  # 在admin页面表的名字(单数)
        verbose_name_plural = verbose_name # 在admin页面表的名字(复数)
        db_table = 'bookinfo'  # 在数据库中的表名


    def __str__(self):  # 直接输出对象时,输出对象名
        return self.name
1)数据库表名

模型类未指表名,默认以子应用名+模型类名未数据库名,可通过db_table指明数据库表名,在元类中写

2)关于在admin表名

为指明表名,默认为模型名,可通过verbose_name设置admin页面表名(单数),verbose_name_plural设置admin页面表名复数

3)关于主键

django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。默认创建的主键列属性为id。

4)属性命名限制
  • 不能时关键字
  • 不允许连续使用下划线
  • 定义属性需要指定字段类型:属性=models.字段类型(选项)

3.迁移

1)注册表
from django.contrib import admin
from books.models import Bookinfo

# Register your models here.
admin.site.register(Bookinfo)

2)执行迁移
python manage.py makemigrations

python manage.py migrate
3)创建超级用户
python manage.py createsuperuser

4. 添加测试数据

在数据库中

insert into bookinfo(name, pub_date, read_count,comment_count, sale_out) values
('射雕英雄传', '1980-5-1', 12, 34, 0),
('天龙八部', '1986-7-24', 36, 40, 0),
('笑傲江湖', '1995-12-24', 20, 80, 0),
('雪山飞狐', '1987-11-11', 58, 24, 0);

5.Shell工具

进入python语句,配置的Django环境

python manage.py shell

6. 增删改查

:进行时把模板导入from books.models import Bookinfo

6.1 增加

方法一:create

Bookinfo.objects.create(
    name= 'python',
    pub_date= '2022-02-22',
    read_count= 500,
    comment_count= 200,
)

方法二:save

book = Bookinfo(
    name= 'python高阶',
    pub_date= '2022-02-25',
    read_count= 600,
    comment_count= 200,
)
book.save()

6.2 修改

方法一:update

Bookinfo.objects.filter(name='python').update(sale_out=True)

方法二:save

book = Bookinfo.objects.get(name='python高阶')
book.read_count = 650
book.save()

6.3 删除

方法一:delete

Bookinfo.objects.filter(name='python').delete()

方法二:

book = Bookinfo.objects.get(name='python高阶')
book.delete()

7.查询

1.基本查询

  • get查询结果单一,不存在会抛出模型类.DoesNotExist异常
  • all查询多个结果
  • count查询数量

2.过滤查询

  • filter过滤,结果是数组
  • exclude排除符合条件,数组
  • get过滤单一结果

3.聚合函数

使用聚合函数先导包from django.db.models import Sum,Max,Min,Avg,Count
用**aggregate()**过滤器调用聚合函数
聚合函数包括:Avg平均、Sum求和、Count数量、Max最大、Min最小

4.排序

order_by()进行排序

5.案例

Bookinfo.objects.get(name='射雕英雄传') # 精准找到一条数据
Bookinfo.objects.filter(name='射雕英雄传') # 过滤的数组
# 查询编号为1的图书
Bookinfo.objects.get(id=1)
Bookinfo.objects.get(id__exact=1) # 精准于上面效果一样
# 查询书名包含'湖'的图书
# 字段名__条件
book = Bookinfo.objects.filter(name__contains='湖') # __contaions包含
# 查询书名以'部'结尾的图书
book = Bookinfo.objects.filter(name__endswith='部') # __endswith以什么结尾
# 查询书名为空的图书
book = Bookinfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
Bookinfo.objects.filter(id__in=[1,3,5])  # in范围
# 查询编号大于3的图书
Bookinfo.objects.filter(id__gt=3)  # gt 大于 gte大于等于 lt小于 lte小于等于
# 查询1980年发表的图书
Bookinfo.objects.filter(pub_date__year=1980)
# 查询1990年1月1日后发表的图书
Bookinfo.objects.filter(pub_date__gt='1990-01-01')
# 查询阅读量大于等于评论量的图书。
from django.db.models import F
Bookinfo.objects.filter(read_count__gte=F('comment_count'))  # F查询是字段与字段比较
# 查询阅读量大于2倍评论量的图书。
Bookinfo.objects.filter(read_count__gt=F('comment_count')*2)
# 查询阅读量大于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)  # exclude 排除
Bookinfo.objects.filter(~Q(id=3))
# 查询图书的总阅读量。
from django.db.models import Sum,Max,Min,Avg,Count
Bookinfo.objects.aggregate(Sum('read_count'))  # aggregate 调用聚合函数
# 查询图书总数。
Bookinfo.objects.count()  # 整型
Bookinfo.objects.aggregate(Count('id')) # 字典
# 查询所有书籍信息平按照阅读量排序。
Bookinfo.objects.all().order_by('read_count') # order_by排序默认升序
Bookinfo.objects.all().order_by('-read_count') # 降序

8 查询集QuerySet

表示从数据库中获取的对象集合
下面调用过滤器方法,会返回查询集(不是简单的列表):

  • all():返回所有数据
  • filter():返回满足条件的数据
  • exclude():返回满足条件之外的数据
  • order_by():对结果排序
    对查询集可以再次调用过滤器进行过滤
    从SQL的角度讲,查询集与select语句等价,过滤器像where、limit、order by子句
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值