Django实用功能汇总

Django实用功能汇总,第1张

文章目录
  • hello world
    • 创建django项目
    • 启动
  • 路由
    • 主路由
    • path转换器
    • 请求与响应
      • HttpRequest对象
      • HttpRespond对象
    • 分布式路由
  • ORM数据库 *** 作
    • 字段类型
    • 字段选项
    • Meta类
    • 数据的增删改查
      • F对象与Q对象
      • 原生sql
      • 关系映射
        • 一对一
        • 一对多
        • 多对多

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/', index),
]

index函数中的page参数值就是uri后面的值。

请求与响应 HttpRequest对象

view函数中第一个参数就是HttpRequest对象

request.path_info # url字符串
request.method # 请求方法
request.GET # 字典,GET请求中参数
request.POST # 字典,POST请求中参数
request.FILES # 包含所有文件上传信息
request.COOKIES # 字典,包含所有cookie
request.session # 字典,表示cookie中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=状态码)

分布式路由

一个项目中,最重要的是代码分层,比如一个电商项目分为登录模块,订单模块等等,不可能同时塞在一个路由中,这时候就需要使用到分布式路由。

  1. 创建应用模块
python3 manager.py startapp 模块名称

此时就会在目录下创建一个文件夹

  1. 在settings.py中注册应用
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'poll'
]
  1. 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,有三个重要参数
    1. auto_now:每次保存对象,自动设置该时间为当前时间
    2. auto_now_add:第一次创建是保存当前时间
    3. default:设置当前时间
  • DateTimeField() 表示日期和时间,数据库类型为datetime,有三个重要参数
    1. auto_now:每次保存对象,自动设置该时间为当前时间
    2. auto_now_add:第一次创建是保存当前时间
    3. default:设置当前时间
  • FloatField() 数据库类型为double
  • DecimalField() 数据库类型decimal,有2个参数:
    1. max_digists:位数总数
    2. 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对象处理复杂逻辑

修改单个数据

  1. 通过get获取对象
  2. 对象.属性=xxx修改值
  3. 对象.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属性

  1. models.CASCADE级联删除
  2. models.PROTECT 如果存在外键引用,则不允许删除
  3. 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()

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/730002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存