Django小笔记

本文详细介绍了Django中如何进行数据库操作,包括连接数据库、定义模型、创建和管理表结构,以及添加、获取、修改和删除数据的方法。同时,讲解了查询操作、关联管理器的使用、聚合与分组查询以及F()和Q()查询等高级技巧,是Django数据库操作的全面教程。
摘要由CSDN通过智能技术生成

auther: LiSoul

模型操作

1. 数据库连接

在项目子目录的setting.py中修改DATABASES

DATABASES = { 
    'default': 
    { 
        'ENGINE': 'django.db.backends.mysql',    # 数据库引擎
        'NAME': 'database_name', # 数据库名称
        'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1 
        'PORT': 3306, # 端口 
        'USER': 'root',  # 数据库用户名
        'PASSWORD': '123456', # 数据库密码
    }  
}

在项目子目录的__init__.py中填入

import pymysql
pymysql.install_as_MySQLdb()

2. 模型定义

  • 创建APP
python django-admin.py startapp TestModel
  • app目录下的model.py中创建你的模型
from django.db import models

class Test(models.Model):
    name = models.CharField(max_length=20)
  • setting.py中引入你创建的模型
INSTALLED_APPS = (
    'app.apps.Appconfig',
)
  • 模型常用操作
python manage.py migrate    # 创建表结构
python manage.py makemigrations YouModel    # 让Django知道我们模型的一些变更
python manage.py migrate YouModel   # 创建自己模型的表结构

3. 数据库操作

1. 添加数据

  • 方案一
book = models.Book(title="菜鸟教程",price=300,publish="菜鸟出版社",pub_date="2008-8-8") 
book.save()
  • 方案二
books = models.Book.objects.create(title="如来神掌",price=200,publish="功夫出版社",pub_date="2010-10-10") 
一对多
  • 方案一
#  获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
#  给书籍的出版社属性publish传出版社对象
book = models.Book.objects.create(title="菜鸟教程", price=200, pub_date="2010-10-10", publish=pub_obj)
  • 方案二
#  获取出版社对象
pub_obj = models.Publish.objects.filter(pk=1).first()
#  获取出版社对象的id
pk = pub_obj.pk
#  给书籍的关联出版社字段 publish_id 传出版社对象的id
book = models.Book.objects.create(title="冲灵剑法", price=100, pub_date="2004-04-04", publish_id=pk)
多对多
  • 方案一
#  获取作者对象
chong = models.Author.objects.filter(name="令狐冲").first()
ying = models.Author.objects.filter(name="任盈盈").first()
#  获取书籍对象
book = models.Book.objects.filter(title="菜鸟教程").first()
#  给书籍对象的 authors 属性用 add 方法传作者对象
book.authors.add(chong, ying)
  • 方案二
#  获取作者对象
chong = models.Author.objects.filter(name="令狐冲").first()
#  获取作者对象的id
pk = chong.pk
#  获取书籍对象
book = models.Book.objects.filter(title="冲灵剑法").first()
#  给书籍对象的 authors 属性用 add 方法传作者对象的id
book.authors.add(pk)
关联管理器(对象调用)
  • 前提条件
    • 多对多(双向均有关联管理器)
    • 一对多(只有多的哪个类的对象有关联管理器,及反向才有)
  • 语法格式

正向:属性名
反向:小写类名加_set

  • 常用方法
函数作用
add()把指定的模型对象添加到关联对象集
create()创建一个新的对象,并同时将它添加到关联对象集之中
remove()从关联对象集中移除执行的模型对象
clear()从关联对象集中移除一切对象,删除关联,不会删除对象

2. 获取数据

函数实现功能返回类型提示
all()查询所有内容QuerySet
filter()查询符合条件的数据QuerySet
exclude()查询不符合条件的数据QuerySet
get()查询符合条件的数据数据只能为一个,否则会报错
order_by()对查询结果进行排序QuerySet降序为在字段前面加个负号-
reverse()对查询结果进行反转QuerySet
count()查询数据的数量Int
first()返回第一条数据相当于[1]
last()返回最后一条数据相当于[-1]
exist()判断查询的结果QuerySet列表里是否有数据bool
values()查询部分字段的数据QuerySet字典序列
values_list()查询部分字段的数据QuerySet元组序列
distinct()对数据去重QuerySetdistinct() 一般是联合 values 或者 values_list 使用
  • 模糊查询
方法实现后面数据
__in读取区间List
__gt大于号Int
__gte大于等于号Int
__it小于号Int
__ite小于等于号Int
__range左闭右闭区间List(两个元素)
__contains包含String
__icontains不区分大小写的包含String
__startswith以指定字符开头String
__endswith以指定字符结尾String
__yearDateField数据类型的年份Int
__monthDateField数据类型的月份Int
__dayDateField数据类型的天数Int
基于对象的跨表查询
  • 语法格式

正向:属性名
反向:小写类名加_set

基于下划线的跨表查询
  • 语法格式

正向:属性名称__跨表的属性名称
反向:小写类名__跨表的属性名称

聚合与分组查询
  • 引入

from django.db.models import Avg,Max,Min,Count,Sum

聚合查询

聚合查询返回值的数据类型是字典。
聚合函数 aggregate() 是 QuerySet 的一个终止子句, 生成的一个汇总值,相当于 count()。
使用 aggregate() 后,数据类型就变为字典,不能再使用 QuerySet 数据类型的一些 API 了。
日期数据类型(DateField)可以用 Max 和 Min。
返回的字典中:键的名称默认是(属性名称加上__聚合函数名),值是计算出来的聚合值。
如果要自定义返回字典的键的名称,可以起别名:
aggregate(别名 = 聚合函数名("属性名称"))

分组查询
  • 返回值:

分组后,用 values 取值,则返回值是 QuerySet 数据类型里面为一个个字典;
分组后,用 values_list 取值,则返回值是 QuerySet 数据类型里面为一个个元组。
MySQL 中的 limit 相当于 ORM 中的 QuerySet 数据类型的切片。

  • 注意:

annotate 里面放聚合函数。
values 或者 values_list 放在 annotate 前面:values 或者 values_list 是声明以什么字段分组,annotate 执行分组。
values 或者 values_list 放在annotate后面: annotate 表示直接以当前表的pk执行分组,values 或者 values_list 表示查询哪些字段, 并且要将 annotate 里的聚合函数起别名,在 values 或者 values_list 里写其别名。

F()查询
  • 引入

from django.db.models import F

  • 用法

F("字段名称")

  • 注意

Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取余的操作。

Q()查询
  • 引入

from django.db.models import Q

  • 用法

Q(条件判断)

  • 注意

Q 对象可以使用 & | ~ (与 或 非)操作符进行组合。

3. 修改数据

  • 方案一
books = models.Book.objects.filter(pk=7).first() 
books.price = 400 
books.save()
  • 方案二
books = models.Book.objects.filter(pk__in=[7,8]).update(price=888)

4. 删除数据

  • 方案一
books=models.Book.objects.filter(pk=8).first().delete()
  • 方案二
books=models.Book.objects.filter(pk__in=[1,2]).delete() 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在社会底层收垃圾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值