数据库连接驱动
pip install mysqlclient
ORM
常用筛选
User.objects.filter(age__lt=10) # 用户表年龄小于筛选
User.objects.filter(name__in=name_list) # 用户姓名包含在列表中
分组合并
class Concat(Aggregate):
"""ORM用来分组显示其他字段 相当于group_concat"""
function = 'GROUP_CONCAT'
template = '%(function)s(%(distinct)s%(expressions)s)'
def __init__(self, expression, distinct=False, **extra):
super(Concat, self).__init__(
expression,
distinct='DISTINCT ' if distinct else '',
output_field=CharField(),
**extra)
User.objects.values('age', 'sex').annotate(name=Concat("name")) # 相同年龄和性别的用户分组,并将 name 字段合并,用逗号隔开
拓展用户表
最好在初始化的时候就确认好用户表的拓展字段,防止后续更新拓展出现迁移困难的问题。
models.py
添加如下代码:
from django.contrib.auth.models import AbstractUser
class UserRecord(AbstractUser):
name = models.CharField(max_length=150, null=True)
age = models.IntegerField(null=True)
class Meta:
db_table = "user_record"
settings.py
添加如下代码:
AUTH_USER_MODEL="django_cas_server.UserRecord"
性能优化
ORM
只获取筛选结果的数量
使用 .count()
方法,而不是 len(records)
。.count()
使用的是 SQL COUNT(*)
的方式,性能效果会更好。
# 示例
user_records_count = UserRecord.objects.filter(age=18).count()
生产部署配置 CheckList
- 关闭 DEBUG(暂时不关闭)
- 开启 CSRF
- 添加安全 header
- 更新生产配置
- 硬编码的变量(URL 等)
- db 连接信息
- 添加 ALLOWED_HOSTS
添加安全 header
# HTTP 部分
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_BROWSER_XSS_FILTER = True
X_FRAME_OPTIONS = 'DENY'
# HTTPS 部分
SECURE_HSTS_SECONDS = 3600
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True