django-cheat-sheet

季森
2023-12-01

数据库连接驱动

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 

参考资料

 类似资料: