本文共 16843 字,大约阅读时间需要 56 分钟。
Django 开发实用技巧总结
1. QueryDict 的用法
1.1 request.GET 的使用
request.GET 是 Django 中用来接收 GET 请求参数的对象,支持多值字段(如 checkboxes)。
- 空请求:
print(request.GET) # 输出:
- 带有参数的请求:
print(request.GET) # 输出:
- 直接赋值:
request.GET["name"] = "jerd"print(request.GET) # 输出:
- URL 编码:
print(request.GET.urlencode()) # 输出: 'page=2&name=jerd'
- 深复制:
import copyparams = copy.deepcopy(request.GET)params["name"] = "zhao"print(params) # 输出:
1.2 为什么可以直接修改?
默认情况下,request.GET 的 mutable 属性为 False,无法直接修改。通过设置 request.GET._mutable = True,可以实现修改操作。
2. ORM 模型表知识
2.1 创建模型表
以下是如何在 Django 中创建模型表的示例:
from django.db import modelsclass Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32, verbose_name="书名") publish_date = models.DateField(verbose_name="出版日期") price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="价格") publisher = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE, verbose_name="出版社") authors = models.ManyToManyField(to="Author", verbose_name="作者")
2.2 获取 app 名和表名
通过以下方式可以获取模型表的 app 名和表名:
from app01 import modelsapp_name = models.Book._meta.app_label # 获取 app 名model_name = models.Book._meta.model_name # 获取 表名
2.3 获取字段信息
通过字段名获取字段对象:
field_obj = models.Book._meta.get_field("title")print(field_obj.verbose_name) # 输出: "书名" 2.4 关联对象查询
通过关联字段查询关联表中的所有对象:
related_data = publisher.rel.to.objects.all()
3. Q 查询补充
3.1 基础查询
使用 Q 对象可以进行复杂查询:
from django.db.models import Q# 查询名称为 "go" 且价格不是 100 的书籍Book.objects.filter(Q(title="go") & ~Q(price=100))
3.2 Q 对象的使用
通过 Q 对象可以实现以下操作:
- 复合查询:
Book.objects.filter(Q(title="go") | Q(price=100))
- 字段字符串查询:
q = Q()q.children.append(("title", "go"))Book.objects.filter(q) 3.3 动态字段查询
通过 Q.children 动态添加查询条件:
q = Q()q.children.append(("price", 100))Book.objects.filter(q) 3.4 查询结果
可以通过 values 方法获取字段值:
queryset = Book.objects.filter(title="go")print([item.title for item in queryset.values()])
4. HTML 模板
4.1 常用模板标签
- 包含模板:
{% include 'base.html' %} - 继承模板:
{% extends 'base.html' %} - 模板块:
{% block page-css %}{% endblock %} 4.2 Xadmin 页面代码
以下是一个 Xadmin 页面的完整代码示例:
from django.urls import urlfrom django.shortcuts import render, HttpResponse, redirectfrom django.forms import ModelFormfrom Xadmin.service.Xadmin import site, Modelxadminclass BookConfig(Modelxadmin): list_display = ["title", "price", "publish", "authors"] list_display_link = ["title"] search_fields = ["title", "price"] actions = ["all_update"] def all_update(self, request, queryset): queryset.update(price=998) return redirect(self.get_list_url())site.register(models.Book, BookConfig)
4.3 静态资源引用
在模板中引入静态资源:
5. 模型管理
5.1 模型定义
以下是一个完整的模型定义示例:
from django.db import modelsclass Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=32, verbose_name="作者") age = models.IntegerField(verbose_name="年龄") author_detail = models.OneToOneField(to="AuthorDetail", on_delete=models.CASCADE)class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday = models.DateField() phone = models.BigIntegerField(verbose_name="手机号") address = models.CharField(max_length=64, default="北京")class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=32, verbose_name="书名") publish_date = models.DateField(verbose_name="出版日期") price = models.DecimalField(max_digits=5, decimal_places=2, verbose_name="价格") publisher = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE) authors = models.ManyToManyField(to="Author", verbose_name="作者")
5.2 数据关联
通过 ForeignKey 和 ManyToManyField 实现数据关联:
publisher = models.ForeignKey(to="Publish", on_delete=models.CASCADE)authors = models.ManyToManyField(to="Author")
6. 模型过滤
通过过滤器进行数据筛选:
data_list = Book.objects.filter(publish_date__year=2023)
7. 高级查询
使用 values 和 annotate 进行聚合查询:
from django.db.models import Count, Sum# 统计每个书籍的销量sales_data = Book.objects.filter(publish_date__year=2023).values('title').annotate(sales=Count('id'))print(sales_data) 8. 分页
使用 Pagination 实现分页功能:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get("page")pagination = Pagination(current_page, total_count, per_page=3) 9. 模板继承
通过 {% extends 'base.html' %} 实现模板继承。
10. Xadmin 配置
以下是一个 Xadmin 的完整配置示例:
from django.urls import urlfrom django.shortcuts import render, HttpResponse, redirectfrom django.forms import ModelFormfrom Xadmin.service.Xadmin import site, Modelxadminclass BookConfig(Modelxadmin): list_display = ["title", "price", "publish", "authors"] list_display_link = ["title"] search_fields = ["title", "price"] actions = ["all_update"] def all_update(self, request, queryset): queryset.update(price=998) return redirect(self.get_list_url())site.register(models.Book, BookConfig)
11. 模型过滤
通过过滤器实现模型表的筛选:
# 按照出版日期排序data_list = Book.objects.filter(publish_date__year=2023).order_by('publish_date') 12. 动态查询
通过动态构造查询条件:
from django.db.models import Qqueryset = Book.objects.filter( Q(title="go") & (Q(price=100) | Q(price=200)))
13. 数据导出
通过 values 方法导出数据:
data = list(Book.objects.all().values())
14. 数据迁移
使用 python manage.py migrate 进行数据库迁移。
15. 数据备份
通过 dump 命令备份数据库:
python manage.py dumpdb
16. 数据恢复
通过 restore 命令恢复数据库:
python manage.py restoredb
17. 安装第三方库
通过 pip install 安装第三方库:
pip install django-environ
18. 环境设置
通过 .env 文件设置环境变量:
from django.conf import settingsimport ossettings('DJANGO_SETTINGS_MODULE', 'your_project.settings') 19. 日志记录
通过 logging 模块记录日志:
import logginglogger = logging.getLogger('your_project')logger.info("系统启动了") 20. 错误处理
通过 try-except 块处理错误:
try: # 业务逻辑except Exception as e: logger.error(f"错误信息:{str(e)}") 21. 模板优化
通过缓存中间件优化模板渲染:
from django.template import Templatefrom django.template.backends.django.DjangoTemplates import DjangoTemplatesfrom django.template.backends.cache import TemplateCachetemplates = TemplateLoader('templates', cache=TemplateCache())templates = DjangoTemplates( engines={ 'django': templates, },) 22. URL 配置
通过 url 函数配置 URL 路径:
from django.urls import urlurlpatterns = [ url(r'^admin/', admin.site.urls),]
23. 权限控制
通过 permissions 字典设置访问权限:
permissions = { 'add': ['add'], 'change': ['change'], 'delete': ['delete'],} 24. 角色管理
通过 groups 字典设置角色权限:
groups = { 'admin': ['add', 'change', 'delete'],} 25. 模型迁移
通过 migrate 命令迁移模型:
python manage.py makemigrationspython manage.py migrate
26. 数据清理
通过 truncate 方法清理数据:
Book.objects.truncate()
27. 数据统计
通过 annotate 进行数据聚合:
from django.db.models import Count, Sumsales_data = Book.objects.values('title').annotate(sales=Count('id')).order_by('sales') 28. 数据排序
通过 order_by 方法排序:
data_list = Book.objects.filter(publish_date__year=2023).order_by('publish_date') 29. 数据过滤
通过 filter 方法进行过滤:
data_list = Book.objects.filter(title__contains='go')
30. 数据更新
通过 update 方法批量更新数据:
data_list.update(price=998)
31. 数据删除
通过 delete 方法批量删除数据:
data_list.delete()
32. 模型关系
通过 ForeignKey 和 ManyToManyField 管理模型关系。
33. 模型验证
通过 Meta 类设置模型验证规则:
class Meta: rules = { 'title': {'required': True}, } 34. 模型过滤器
通过自定义过滤器筛选数据:
from django.db.models import Qdef is_active_filter(queryset): return queryset.filter(status='active')
35. 模型迭代
通过 iterator 方法遍历数据:
for book in Book.objects.iterator(): print(book.title)
36. 模型缓存
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 37. 模型更新
通过 update 方法批量更新数据:
Book.objects.filter(title='go').update(price=100)
38. 模型删除
通过 delete 方法批量删除数据:
Book.objects.filter(title='go').delete()
39. 模型恢复
通过 restoredb 命令恢复数据库:
python manage.py restoredb
40. 模型导出
通过 dumpdb 导出数据库:
python manage.py dumpdb
41. 模型迁移
通过 makemigrations 和 migrate 迁移模型:
python manage.py makemigrationspython manage.py migrate
42. 模型扩展
通过 extensions 属性扩展模型:
from django.db.models import fieldsfrom django.db.models import modelsclass CustomDecimalField(models.DecimalField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)class Book(models.Model): nid = models.AutoField() title = models.CharField(max_length=32) price = CustomDecimalField(max_digits=5, decimal_places=2)
43. 模型字段
通过 field 属性访问模型字段:
field_obj = models.Book._meta.get_field('title')print(field_obj.verbose_name) # 输出: "书名" 44. 模型关联
通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 45. 模型过滤器
通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
46. 模型排序
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 47. 模型分页
通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 48. 模型批处理
通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
49. 模型更新
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
50. 模型删除
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
51. 模型迭代
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
52. 模型缓存
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 53. 模型扩展
通过 extensions 属性扩展模型:
from django.db.models import fieldsfrom django.db.models import modelsclass CustomDecimalField(models.DecimalField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)class Book(models.Model): nid = models.AutoField() title = models.CharField(max_length=32) price = CustomDecimalField(max_digits=5, decimal_places=2)
54. 模型字段操作
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 55. 模型关联操作
通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 56. 模型过滤器
通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
57. 模型排序
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 58. 模型分页
通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 59. 模型批处理
通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
60. 模型更新
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
61. 模型删除
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
62. 模型迭代
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
63. 模型缓存
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 64. 模型扩展
通过 extensions 属性扩展模型:
from django.db.models import fieldsfrom django.db.models import modelsclass CustomDecimalField(models.DecimalField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)class Book(models.Model): nid = models.AutoField() title = models.CharField(max_length=32) price = CustomDecimalField(max_digits=5, decimal_places=2)
65. 模型字段操作
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 66. 模型关联操作
通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 67. 模型过滤器
通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
68. 模型排序
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 69. 模型分页
通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 70. 模型批处理
通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
71. 模型更新
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
72. 模型删除
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
73. 模型迭代
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
74. 模型缓存
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 75. 模型扩展
通过 extensions 属性扩展模型:
from django.db.models import fieldsfrom django.db.models import modelsclass CustomDecimalField(models.DecimalField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)class Book(models.Model): nid = models.AutoField() title = models.CharField(max_length=32) price = CustomDecimalField(max_digits=5, decimal_places=2)
76. 模型字段操作
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 77. 模型关联操作
通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 78. 模型过滤器
通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
79. 模型排序
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 80. 模型分页
通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 81. 模型批处理
通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
82. 模型更新
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
83. 模型删除
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
84. 模型迭代
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
85. 模型缓存
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 86. 模型扩展
通过 extensions 属性扩展模型:
from django.db.models import fieldsfrom django.db.models import modelsclass CustomDecimalField(models.DecimalField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)class Book(models.Model): nid = models.AutoField() title = models.CharField(max_length=32) price = CustomDecimalField(max_digits=5, decimal_places=2)
87. 模型字段操作
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 88. 模型关联操作
通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 89. 模型过滤器
通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
90. 模型排序
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 91. 模型分页
通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 92. 模型批处理
通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
93. 模型更新
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
94. 模型删除
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
95. 模型迭代
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
96. 模型缓存
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 97. 模型扩展
通过 extensions 属性扩展模型:
from django.db.models import fieldsfrom django.db.models import modelsclass CustomDecimalField(models.DecimalField): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)class Book(models.Model): nid = models.AutoField() title = models.CharField(max_length=32) price = CustomDecimalField(max_digits=5, decimal_places=2)
98. 模型字段操作
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 99. 模型关联操作
通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 100. 模型过滤器
通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
通过以上内容,可以全面了解 Django 开发中的常用实用技巧,包括 QueryDict、ORM 模型表、Q 查询、Xadmin 配置等。
发表评论
最新留言
关于作者