django
创建项目和app
- 安装django模块
pip install django
- 创建项目
django-admin startproject test1
- 默认项目的文件树:
└─test1
│ manage.py [不要动]
│
└─test1
asgi.py [不要动]
settings.py 常修改
urls.py 常修改
wsgi.py [不要动]
__init__.py
- 创建app
python manage.py startapp app1
app的文件树:
├─app1
│ │ admin.py [不用动]
│ │ apps.py [不用动]
│ │ models.py 操作数据库
│ │ tests.py [不用动]
│ │ views.py 视图文件
│ │ __init__.py
│ │
│ └─migrations [不用动]
│ __init__.py
- 注册app
在settings.py的INSTALLED_APPS中加入app1.apps.App01Config
- 在urls.py中添加路由
from app1 import views
#...
path('index/', views.index)
- 在views.py中添加index函数
from django.shortcuts import render, HttpResponse
# Create your views here.
def index(request):
return HttpResponse("欢迎")
- 启动服务
python manage.py runserver
Django 模板基础
1. 加载静态文件
- 使用
{% load static %}
标签来加载静态文件。 - 示例:
{% load static %} <img src="{% static 'baidu.png' %}">
2. 循环遍历数据
- 使用
{% for %}
和{% endfor %}
标签来遍历数据。 - 示例:
{% for i in sidebar %}
<a href="#">{{ i }}</a>
{% endfor %}
3. 条件判断
- 使用
{% if %}
,{% elif %}
, 和{% else %}
标签来进行条件判断。 - 示例:
{% if condition %}
<p>Condition is true</p>
{% elif other_condition %}
<p>Other condition is true</p>
{% else %}
<p>No conditions are true</p>
{% endif %}
4. 过滤器
- 使用过滤器来处理变量值。
- 示例:
{{ variable|lower }} <!-- 将变量转换为小写 -->
5. 注释
- 使用
{# ... #}
来添加注释。 - 示例:
html{# This is a comment #}
Django 视图基础
1. HttpResponse
HttpResponse
是一个类,用于返回响应给客户端。可以直接返回字符串、HTML 内容等。
from django.http import HttpResponse
def hello(request):
return HttpResponse("Hello, world!")
2. render
render
函数用于将模板渲染为 HTML 并返回给客户端。需要传递三个参数:请求对象 (request
)、模板文件名、上下文数据(字典)。
from django.shortcuts import render
def home(request):
context = {'name': '张三', 'age': 25}
return render(request, 'home.html', context)
3. redirect
redirect
函数用于重定向到其他 URL。可以传递一个 URL 字符串或视图函数名。
from django.shortcuts import redirect
def something(request):
return redirect('https://www.baidu.com')
请求对象属性
pycharm社区版好像没有代码提示,可以用dir方法查看类和方法:
print([i for i in dir(request) if '__' not in i])
1. request.method
获取 HTTP 请求方法(GET, POST 等)。
print(request.method) # 输出 'GET' 或 'POST'
2. request.GET
获取 GET 请求参数。
print(request.GET) # 输出 QueryDict 对象
print(request.GET.get('key')) # 获取指定键的值
3. request.POST
获取 POST 请求参数。
print(request.POST) # 输出 QueryDict 对象
print(request.POST.get('key')) # 获取指定键的值
Django ORM配置
在settings.py中添加以下内容,使用pymysql
import pymysql
pymysql.install_as_MySQLdb()
修改settings.py中的DATABASES
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_orm',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '10.89.0.2',
'PORT': '3306'
}
}
在models.py中添加类
class UserInfo(models.Model):
name = models.CharField(max_length=32)
password = models.CharField(max_length=64)
age = models.IntegerField(default=2)
class Meta:
db_table = 'user_info'
class Department(models.Model):
title = models.CharField(max_length=16)
class Meta:
db_table = 'department'
执行命令:
python manage.py makemigrations
# 如果不起作用检查app1/migrations/__init__.py是否存在
python manage.py migrate
使用ORM操作数据库
在app1下新建文件insert_to_db.py
import django
import os
import sys
sys.path.append("/root/python/楚仪杯/django/test06/")
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test06.settings")
django.setup()
from app1.models import UserInfo
# 创建记录
# 1. 创建一条数据
UserInfo.objects.create(name='张三',password='123456',age=18)
# 2. 一次创建多个数据
UserInfo.objects.bulk_create(
[
UserInfo(name='李四',password='123456',age=18)
UserInfo(name='王五',password='123456',age=18)
]
)
# 获取数据
# 1.获取所有的数据
data_list = UserInfo.objects.all() # QuerySet类型
for obj in data_list:
print(obj.id, obj.name, obj.password, obj.age)
# 2. 获取符合条件的数据
data_list = UserInfo.objects.filter(id=1)
# 删除数据
UserInfo.objects.filter(id=3).delete()
Department.objects.all().delete()
# 更新数据
UserInfo.objects.all().update(password=999)
UserInfo.objects.filter(id=2).update(age=123)
UserInfo.objects.filter(name="张三").update(age=18)
# 其他方法
# order_by排序
UserInfo.objects.order_by('id')
UserInfo.objects.order_by('-id') # 加负号表示降序
补充:
Django Q 查询
1. 核心功能
- 实现
OR
、AND
、NOT
组合查询 - 支持嵌套多层条件
- 动态构建复杂查询逻辑
2. 基础用法
2.1 导入 Q 对象
from django.db.models import Q
2.2 基本查询
# OR 查询(标题包含"django" 或 内容包含"web")
Article.objects.filter(Q(title__icontains='django') | Q(content__icontains='web'))
# AND 查询(状态已发布且作者是张三)
Article.objects.filter(Q(status='published') & Q(author='张三'))
# NOT 查询(排除未发布文章)
Article.objects.filter(~Q(status='draft'))
2.3 多条件组合
# (标题含"Python" 或 内容含"编程") 且 阅读量>100
query = (Q(title__icontains='Python') | Q(content__icontains='编程')) & Q(views__gt=100) Article.objects.filter(query)
常用查询类型:
查询类型 | 作用 | 示例 |
---|---|---|
in | 匹配列表中的任意值 | id__in=[1, 3, 5] |
contains | 包含字符串(区分大小写) | content__contains=“error” |
icontains | 包含字符串(不区分大小写) | title__icontains=“web” |
regex | 正则表达式匹配(区分大小写) | title__regex=r’^A.*z$’ |
gt | 大于 | views__gt=100 |
gte | 大于等于 | price__gte=50 |
lt | 小于 | rating__lt=3.5 |
lte | 小于等于 | age__lte=30 |
range | 范围区间(闭区间) | date__range=(“2023-01-01”, “2023-12-31”) |
isnull | 字段是否为 NULL | author__isnull=True |
year | 匹配年份 | pub_date__year=2023 |
month | 匹配月份(1-12) | pub_date__month=12 |
day | 匹配日期(1-31) | pub_date__day=25 |
week | 周数(ISO 标准,1-53) | pub_date__week=52 |
hour | 小时(0-23) | timestamp__hour=15 |
Queryset 常用属性和方法
方法 | 作用 | 示例 |
---|---|---|
distinct() | 去重(多用于跨表查询) | Book.objects.filter(author__age__gt=30).distinct() |
values() | 返回字典列表(指定字段) | Book.objects.values(‘title’, ‘price’) |
values_list() | 返回元组列表(flat=True 返回单个值列表) | Book.objects.values_list(‘id’, flat=True) |
_meta 获取字段名
方法/属性 | 作用 |
---|---|
_meta.get_fields() | 获取所有字段(包括关联字段和反向关联) |
_meta.fields | 仅获取模型直接定义的数据库字段 |
**Django-Redis **
1. 安装配置
# 安装依赖
pip install django-redis redis
在settings.py中添加:
# Redis缓存配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://10.89.0.2:6379/1", # 1号数据库
"TIMEOUT": 60*15 # 默认缓存时间(秒)
}
}
# 使用Redis存储会话
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
2. 基础用法
from django.core.cache import cache
# 设置缓存
cache.set('hot_news', news_list, timeout=3600) # 缓存1小时
cache.set_many({'key1': val1, 'key2': val2}) # 批量设置
# 获取缓存
data = cache.get('hot_news')
multi_data = cache.get_many(['key1', 'key2'])
# 删除缓存
cache.delete('expired_data')
cache.delete_many(['key1', 'key2'])
cache.clear() # 清空所有缓存
3. 视图缓存
from django.views.decorators.cache import cache_page
# 页面级别缓存(15分钟)
@cache_page(60 * 15)
def product_list(request):
# ...
# 带参数缓存(不同参数不同缓存)
@cache_page(60 * 5, key_prefix='product-detail')
def product_detail(request, product_id):
# ...