Django 开发框架学习
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django 开发框架学习相关的知识,希望对你有一定的参考价值。
Django 开发框架学习(二)
模型查询
- 创建超级用户:
python manage.py createsuperuser
在模型中重写__str__
方法以显示文字信息:
from django.db import models
# Create your models here.
"""
1.定义模型类
2.模型迁移
2.1 先生成迁移文件(不会在数据库中生成表,只会创建一个 数据库和模型的对应关系)
python manage.py makemigrations
2.2 再迁移(会在数据库生成表)
python manage.py migrate
3.操作数据库
ORM对应的关系
表-->类
字段-->属性
"""
class BookInfo(models.Model):
"""
1.主键 当前会自动生成
2.属性复制过来就可以
"""
name = models.CharField(max_length=10)
def __str__(self):
return self.name
class PeopleInfo(models.Model):
name = models.CharField(max_length=10)
# 性别
gender = models.BooleanField()
# 外键
book = models.ForeignKey(BookInfo)
<ul>
<li>adada</li>
<li>adada</li>
<li>adada</li>
</ul>
views.py
中处理业务逻辑:
模型查询:
from django.shortcuts import render
from django.http import HttpRequest, HttpResponse
from book.models import BookInfo
# Create your views here.
"""
视图
1.就是python函数
2.函数的第一个参数就是 请求 和请求相关的 它是HttpReuest的实例对象
3.我们必须要返回一个响应 响应是HttpResponse的实例对象/子类实例对象
"""
def index(request):
# request, template_name, context = None
# 参数1:当前的请求
# 参数2:模板文件
# 实现业务逻辑
# 1.先把所有书籍查询出来 select * from bookinfo
# ORM
books = BookInfo.objects.all()
# books = [BookInfo(), BookInfo()]
# 2.组织数据
context =
'books':books
# 3.将组织好的数据传递给模板
return render(request, 'index.html', context)
<ul>
# 动态遍历
% for book in books %
<li>book.name</li>
% endfor %
</ul>
配置文件
-
DEBUG = True
:开发者调试使用,部署上线后改为False -
BASE_DIR
:项目根目录 -
__file__
:当前文件的名字 -
os.path.abspath(__file__)
:绝对路径 -
os.path.dirname(os.path.abspath(__file__))
:文件夹/文件目录(os.path.dirname:文件夹所在目录)
静态文件配置
"""
diango是如何区分 静态资源和动态资源
就是通过 STATIC_URL
我们在访问静态资源 http://ip:port + STATIC_URL + 文件名
django就会认为我们访问静态资源,这个时候就会去静态资源文件夹中进行匹配
"""
STATIC_URL = '/static/'
# 告知系统静态文件在哪里
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
App配置相关
安装注册子应用:
# 安装注册子应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
# 'book', # 重复
'book.apps.BookConfig',
'login.apps.LoginConfig',
'pay.apps.PayConfig',
# 子应用名
# 子应用名.apps.# 子应用名Config
]
django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: book
:重复注册
后台相关:
from django.apps import AppConfig
# 配置信息
class BookConfig(AppConfig):
name = 'book'
verbose_name = '后台相关'
使用这个才会显示后台相关:'book.apps.BookConfig',
模型定义相关
创建子应用:django-admin startapp book
book-->models.py
from django.db import models
# Create your models here.
"""
1.定义模型类
2.模型迁移
2.1 先生成迁移文件(不会在数据库中生成表,只会创建一个 数据库和模型的对应关系)
python manage.py makemigrations
2.2 再迁移(会在数据库生成表)
python manage.py migrate
3.操作数据库
1.ORM对应的关系
表-->类
字段-->属性
2.模型需要继承自models.Model
3.模型会自动为我们添加一个主键
4.属性名=属性类型(选项)
属性名:不要使用python或mysql关键字(desc)
不要使用连续的下划线__
属性类型:和mysql类型类似
选项:charfield必须设置max_length
null 是否为空
unique 唯一
书籍表:
id, name, pub_date, readcount, commentcount, is_delete
"""
class BookInfo(models.Model):
"""
1.主键 当前会自动生成
2.属性复制过来就可以
"""
name = models.CharField(max_length=10, unique=True, verbose_name="名字")
# 发布日期
pub_date = models.DateField(null=True)
#阅读量
readcount = models.IntegerField(default=0)
#评论量
commentcount = models.IntegerField(default=0)
#是否逻辑删除
is_delete = models.BooleanField(default=False)
def __str__(self):
return self.name
# 修改表名
class Meta:
db_table = 'bookinfo'
class PeopleInfo(models.Model):
name = models.CharField(max_length=10)
# 性别
gender = models.BooleanField()
# 外键
book = models.ForeignKey(BookInfo)
# 修改表名
class Meta:
db_table = 'bookinfo'
on_delete=models.CASCADE
:实现一个表对另一个表实现级联操作
修改数据库引擎
-
sqlite 主要是一个嵌入式的关系型数据库,主要是在 移动端使用
-
sqlite 属于小型的关系型数据库
-
中型的数据库: mysql(甲骨文) sqlserver(微软的),
-
大型的数据库: oracle ,DB2
import pymysql
pymysql.install_as_MySQLdb()
- 连接数据库:
mysql -uroot -pmysql -h 127.0.0.1 --port 3306
create database book charset uf8;
use book;
- 命令行:
python manage.py makemigrations;
- show tables;
python manage.py migrate;
desc bookinfo
shell
model.py
下类中的属性名即为字段名
insert into bookinfo(name, pub_date, readcount,commentcount, is_delete) 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);
类似于 ipython的东西:python manage.py shell
数据操作
新增&修改数据
from django.http import HttpResponse
from django.shortcuts import render
from book.models import BookInfo
# Create your views here.
# tel: 18310820688
def index(request):
# 1.到数据库中查询书籍
books= BookInfo.objects.all()
#2.组织数据
context =
'books':books
#3.传递给模板
# render(request,'',context)
return HttpResponse('index')
##############################新增数据#####################################
from book.models import BookInfo
#方式1
# 会把新生成的对象返回给我们
book=BookInfo(
name='python',
pub_date='2000-01-01'
)
# 需要手动调用save方法
book.save()
#方式2 直接入库
# objects 模型的管理类
# 我们对模型的 增删改查 都找它
# 会把新生成的对象返回给我们
BookInfo.objects.create(
name='java',
pub_date='2010-1-1'
)
##############################修改(更新)数据#####################################
from book.models import BookInfo
# 方式1
#1.先查询数据
# select * from bookinfo where id=1
book=BookInfo.objects.get(id=1)
#2. 直接修改实例的属性
book.readcount=20
#3.调用save方法
book.save()
# 方式2 直接更新
# filter 过滤
BookInfo.objects.filter(id=1).update(
readcount=100,
commentcount=200
)
删除数据
##############################删除数据#####################################
#方式1
# 1. 先查询出数据
book=BookInfo.objects.get(id=5)
#2.调用删除方法
book.delete()
#方式2
BookInfo.objects.filter(id=6).delete()
查询操作
###############################基本查询#####################################
# get 得到某一个数据
# all 获取所有的
# count 个数
#select * from bookinfo where id=1
# 返回一个对象
book=BookInfo.objects.get(id=1)
#查询id 不存在的数据会抛出异常
book=BookInfo.objects.get(id=100)
"""
book.models.DoesNotExist: BookInfo matching query does not exist.
"""
try:
book=BookInfo.objects.get(id=2)
# except Exception :
# pass
except BookInfo.DoesNotExist:
pass
# 返回所有结果,列表
BookInfo.objects.all()
# count 二者一样
BookInfo.objects.all().count()
BookInfo.objects.count()
filter,get,exclude
select from bookinfo where 条件语句
相当于 where查询
filter : 筛选/过滤 返回 n个结果 (n = 0/1/n)
get : 返回1个结果
exclude : 排除掉符合条件剩下的结果 相当于 not
语法形式:
以filter(字段名__运算符=值) 为例
# 查询编号为1的图书
# exact 精确的 准确的 就是等于
BookInfo.objects.get(id__exact=1)
BookInfo.objects.get(id=1)
BookInfo.objects.filter(id=1)
BookInfo.objects.filter(id__exact=1)
# 查询书名包含'湖'的图书
# contains 包含
BookInfo.objects.filter(name__contains='湖')
# 查询书名以'部'结尾的图书
BookInfo.objects.filter(name__endswith='部')
# 查询书名为空的图书
BookInfo.objects.filter(name__isnull=True)
# 查询编号为1或3或5的图书
# select * from bookinfo where id in (1, 3, 5);
BookInfo.objects.filter(id__in=[1,3,5])
# 查询编号大于3的图书
# gt 大于 great 大
# gte 大于等于 e equal 等于
# lt 小于 less than
# lte 小于等于
BookInfo.objects.filter(id__gt=3)
# 查询书籍id不为3的图书
BookInfo.objects.exclude(id__exact=3)
BookInfo.objects.exclude(id=3)
# 查询1980年发表的图书
BookInfo.objects.filter(pub_date__year='1980')
# 查询1990年1月1日后发表的图书
BookInfo.objects.filter(pub_date__gt='1990-1-1')
# BookInfo.objects.filter(pub_date__gt='1990.1.1') #错误的
两个字段比较(F和Q对象)
###############################F(了解)#####################################
#两个属性怎么比较 F对象
"""
F对象的语法形式
filter(字段名__运算符=F('字段名'))
"""
from django.db.models import F
#查询阅读量大于等于评论量的图书
BookInfo.objects.filter(readcount__gte=F('commentcount'))
#查询阅读量大于等于评论量2倍的图书
BookInfo.objects.filter(readcount__gte=F('commentcount')*2)
###############################Q对象(了解)#####################################
# 需要查询id大于2 并且阅读量大于20的书籍
#方式1
# filter().filter()
BookInfo.objects.filter(id__gt=2).filter(readcount__gt=20)
#方式2
# filter(条件,条件)
BookInfo.objects.filter(id__gt=2,readcount__gt=20)
# 需要查询id大于2 或者 阅读量大于20的书籍
from django.db.models import Q
"""
Q(字段名__运算符=值)
或 Q()|Q() ..
并且 Q()&Q() ..
not ~Q()
"""
BookInfo.objects.filter(Q(id__gt=2)|Q(readcount__gt=20))
# 查询书籍id不为3
BookInfo.objects.exclude(id=3)
BookInfo.objects.filter(~Q(id=3))
聚合函数&排序
###############################聚合函数(了解)#####################################
"""
Sum,Max,Min,Avg,Count
聚合函数需要使用 aggregate
语法形式是: aggragte(Xxx('字段'))
"""
# 当前数据的阅读总量
from django.db.models import Sum,Avg,Max,Min,Count
BookInfo.objects.aggregate(Sum('readcount'))
###############################排序#####################################
# 默认升序
BookInfo.objects.all().order_by('readcount')
#降序
BookInfo.objects.all().order_by('-readcount')
关联查询
"""
书籍和人物的关系是 1:n
书籍 中没有任何关于人物的字段
人物 中有关于书籍的字段 book 外键
语法形式
通过书籍查询人物信息( 已知 主表数据,关联查询从表数据)
主表模型(实例对象).关联模型类名小写_set.all()
通过人物查询书籍信息( 已知 从表数据,关联查询主表数据)
从表模型(实例对象).外键
查询书籍为1的所有人物信息
查询人物为1的书籍信息
"""
# 查询书籍为1的所有人物信息
# 通过书籍 查询人物
#1.查询书籍
book=BookInfo.objects.get(id=1)
#2.根据书籍关联人物信息
book.peopleinfo_set.all()
#查询人物为1的书籍信息
# 根据书籍 查询人物
from book.models import PeopleInfo
#1.查询人物
person=PeopleInfo.objects.get(id=1)
#2.根据人物关联查询书籍
# person.book 实例对象
person.book
person.book.name
关联查询的筛选
"""
书籍和人物的关系是 1:n
书籍 中没有任何关于人物的字段 (不要考虑隐藏的哪个字段)
人物 中有关于书籍的字段 book 外键
语法形式
我们需要的是 书籍信息,已知条件是 人物信息
=我们需要的是 主表数据,已知条件是 从表信息
filter(关联模型类名小写__字段__运算符=值)
我们需要的是 人物信息,已知条件是 书籍信息
我们需要是是 从表数据,已知条件是 主表信息
filter(外键__字段__运算符=值)
"""
"""
查询图书,要求图书人物为"郭靖"
查询图书,要求图书中人物的描述包含"八"
"""
# 需要的是图书,条件是人物
BookInfo.objects.filter(peopleinfo__name__exact='郭靖')
BookInfo.objects.filter(peopleinfo__name='郭靖')
BookInfo.objects.filter(peopleinfo__description__contains='八')
"""
查询书名为“天龙八部”的所有人物
查询图书阅读量大于50的所有人物
"""
PeopleInfo.objects.filter(book__name='天龙八部')
PeopleInfo.objects.filter(book__name__exact='天龙八部')
PeopleInfo.objects.filter(book__readcount__gt=50)
# 射雕,雪山
加油!
感谢!
努力!
以上是关于Django 开发框架学习的主要内容,如果未能解决你的问题,请参考以下文章