hello world
创建django项目
django-admin startproject 项目名称
启动
python manage.py runserver
此时项目进程就会默认监听8000端口
如果想更换端口,可以使用以下命令:
python manage.py runserver 8080
如果想更换ip,可以使用以下命令:
python manage.py runserver 0.0.0.0:8080
路由
主路由
所谓路由,通俗理解就是http请求中uri与对应处理函数的映射关系。
在创建项目中 urls.py 中可以配置主路由信息。 在view.py中配置路由处理函数:
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello, world. You're at the polls index.")
在urls.py中配置映射关系
from django.contrib import admin
from django.urls import path
from .view import index
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', index),
]
path转换器
path假如里面有个参数可变的怎么办? 如: page/1,page/2,page/100 这时候就需要用到path转换器
from django.http import HttpResponse
def index(request,page):
return HttpResponse("Hello, world. You're at the polls index.")
在urls.py中配置映射关系
from django.contrib import admin
from django.urls import path
from .view import index
urlpatterns = [
path('admin/', admin.site.urls),
path('index/<int:page>', index),
]
index函数中的page参数值就是uri后面的值。
请求与响应
HttpRequest对象
view函数中第一个参数就是HttpRequest对象
request.path_info
request.method
request.GET
request.POST
request.FILES
request.COOKIES
request.session
request.body
request.scheme
request.META
HttpRespond对象
from django.http import HttpResponse
def index(request,page):
return HttpResponse("Hello, world. You're at the polls index.")
HttpResponse(content=响应体,content_type=响应数据类型,status=状态码)
分布式路由
一个项目中,最重要的是代码分层,比如一个电商项目分为登录模块,订单模块等等,不可能同时塞在一个路由中,这时候就需要使用到分布式路由。
- 创建应用模块
python3 manager.py startapp 模块名称
此时就会在目录下创建一个文件夹
- 在settings.py中注册应用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'poll'
]
- urls.py中写入子路由
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('polls/', include('polls.urls'))
]
include就代表子路由
ORM数据库操作
在models.py中编写模型类
from django.db import models
class 模型名称(models.Model):
字段名=models.字段类型(字段选项)
迁移同步命令: makemigrations & migrate
字段类型
- BooleanField() 编程语言使用True或者False来表示值,数据库类型为tinyint
- CharField() 数据库类型为varchar, 必须要有max_length参数值
- DateField() 表示日期,数据库类型为date,有三个重要参数
- auto_now:每次保存对象,自动设置该时间为当前时间
- auto_now_add:第一次创建是保存当前时间
- default:设置当前时间
- DateTimeField() 表示日期和时间,数据库类型为datetime,有三个重要参数
- auto_now:每次保存对象,自动设置该时间为当前时间
- auto_now_add:第一次创建是保存当前时间
- default:设置当前时间
- FloatField() 数据库类型为double
- DecimalField() 数据库类型decimal,有2个参数:
- max_digists:位数总数
- decimal_places:小数点后数字数量
- EmailField() 数据库类型varchar
- IntegerField() 数据库类型int
- ImageField() 数据库类型varchar保存图片地址
- TextField() 数据库类型longtext
字段选项
- primary_key: 如果为True该字段为主键,不会自动创建id
- null: 如果为True代表该列允许为空
- default: 设置所在列的默认值
- db_index: 如果为True代表为该列增加索引
- unique: 如果为True代表为该列唯一
- db_column: 指定列名称,如果不指定采用属性名作为列名
- default: 设置所在列的默认值
Meta类
默认表名为类名小写,如果想要指定表名就需要Meta类
from django.db import models
class 模型名称(models.Model):
字段名=models.字段类型(字段选项)
class Meta:
db_table="xxxx"
数据的增删改查
这边模拟Book对象
from django.db import models
class Book(models.Model):
name=models.CharField()
price=FloatField()
增
方法1:
Book.objects.create(name="name1",price=35.5)
方法2
book=Book()
book.name="name1"
book.price=35.5
book.save()
查
通过Book.objects.方法来进行数据库查询操作
方法 | 说明 |
---|
all() | 获取全部记录,返回QurrySet对象 | get() | 查询符合条件的单一记录 | filter() | 查询符合条件的多条记录 | exclude() | 查询符合条件之外的多条记录 |
需求1:查询所有书本
books=Book.objects.all()
需求2:按价格顺序降序列出书本
books=Book.objects.all().order_by("-price")
字段前面加个-,说明为降序
需求3:按价格>30 and name="123"作为条件筛选出书本‘
books=Book.objects.filter(name='123',price__gt=30)
这边支持以下写法:
- __contain 等价于like %str%
- __startswith: 以xxx开始
- __endswith: 以xxx开始
- __gt 大于
- __gte 大于等于
- __lt 小于
- __lte 小于等于
- __in 在范围内books=Book.objects.filter(name__in=[‘123’,‘456’])
- __range 在范围内books=Book.objects.filter(price__range=(25,35))
需求4:按价格>30 or name="123"作为条件筛选出书本‘
from django.db.models import Q
books=Book.objects.filter(Q(price_gt=30)|Q(name='123'))
Q对象处理复杂逻辑
改
修改单个数据
- 通过get获取对象
- 对象.属性=xxx修改值
- 对象.save()保存
批量修改数据 QuerySet有个update方法可以实现批量更新
books=Book.objects.all()
books.update(price=100)
删
删除单个数据
book=Book.objects.fliter(id=1)
book.delete()
批量删除数据
books=Book.objects.all()
books.delete()
F对象与Q对象
F对象代表数据库中某条字段信息,通常用于对数据库中字段的值在不获取情况下进行操作或者用于属性字段之间比较。 典型场景1: 更新所有书本,涨价10元 如果用一般方法需要进行遍历
books=Book.objects.all()
books.update(price=F(price)+10)
典型场景2: 查询所有market_price大于price的书本
books=Book.objects.filter(market_price_gt=F('price'))
等价于 select * from book b where b.market_price_gt>b.price
原生sql
方法1:
books=Book.objects.raw("select * from book")
方法2:
from django.db import connection
def my_custom_sql():
with connection.cursor() as cursor:
cursor.execute("SELECT foo FROM bar WHERE baz = %s", [baz])
row = cursor.fetchone()
return row
关系映射
一对一
创建:
from django.db import models
class Husband(models.Model):
name=models.CharField(max_length=5)
age=models.IntegerField()
class Wife(models.Model):
name=models.CharField(max_length=5)
age=models.IntegerField()
husband=models.OneToOneField(Husband,on_delete=models.CASCADE)
husband=Husband.objects.create(name="小马",age=20)
wife=Wife.objects.create(name="小红",age=18,husband=husband)
wife=Wife.objects.create(name="小红",age=18,husband_id=1)
on_delete属性
- models.CASCADE级联删除
- models.PROTECT 如果存在外键引用,则不允许删除
- SET_NULL 不设置外键
查询: 正向查询
wife=Wife.objects.get(id=1)
husband=wife.husband
反向查询
husband=Husband.objects.get(id=1)
wife=husband.wife
一对多
创建:
from django.db import models
class Publisher(models.Model):
name=models.CharField(max_length=5)
class Book(models.Model):
name=models.CharField(max_length=5)
publisher=models.ForeignKey(Publisher,on_delete=models.CASCADE)
publisher=Publisher.objects.create(name="清华出版社")
book1=Book.objects.create(name="c++ prime",publisher=publisher)
book2=Book.objects.create(name="java并发编程",publisher_id=1)
查询: 正向查询(通过book查找publisher)
book=Book.objects.get(id=1)
publisher=book.publisher
反向查询(通过publisher查找book)
publisher=Publisher.objects.get(id=1)
books=publisher.book_set.all()
多对多
创建:
from django.db import models
class Author(models.Model):
name=models.CharField(max_length=5)
class Book(models.Model):
name=models.CharField(max_length=5)
authors=models.ManyToMayFiled(Author,on_delete=models.CASCADE)
此时会自动创建第三张表做他们之间的关系映射
author1=Author.objects.create(name="tdx")
author2=Author.objects.create(name="mytdx")
book1=author1.book_set.create(name="java并发编程")
author2.book_set.add(book1)
等价于
book=Book.objects.create(name="java并发编程")
Book.authors.create(name="mytdx")
Book.authors.create(name="tdx")
查询: 正向查询(通过book查询author):
book=Book.objects.get(id=1)
authors=book.authors.all()
authors=book.authors.filter(name="tdx")
反向查询(通过author查询book):
books=Author.book_set.all()
books=Author.book_set.filter()
|