QueryDict和模型表知识补充
发布日期:2025-05-05 14:55:27 浏览次数:3 分类:精选文章

本文共 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 copy
params = copy.deepcopy(request.GET)
params["name"] = "zhao"
print(params) # 输出:

1.2 为什么可以直接修改?

默认情况下,request.GETmutable 属性为 False,无法直接修改。通过设置 request.GET._mutable = True,可以实现修改操作。

2. ORM 模型表知识

2.1 创建模型表

以下是如何在 Django 中创建模型表的示例:

from django.db import models
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, verbose_name="出版社")
authors = models.ManyToManyField(to="Author", verbose_name="作者")

2.2 获取 app 名和表名

通过以下方式可以获取模型表的 app 名和表名:

from app01 import models
app_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 url
from django.shortcuts import render, HttpResponse, redirect
from django.forms import ModelForm
from Xadmin.service.Xadmin import site, Modelxadmin
class 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 models
class 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. 高级查询

使用 valuesannotate 进行聚合查询:

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 Pagination
current_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 url
from django.shortcuts import render, HttpResponse, redirect
from django.forms import ModelForm
from Xadmin.service.Xadmin import site, Modelxadmin
class 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 Q
queryset = 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 settings
import os
settings('DJANGO_SETTINGS_MODULE', 'your_project.settings')

19. 日志记录

通过 logging 模块记录日志:

import logging
logger = logging.getLogger('your_project')
logger.info("系统启动了")

20. 错误处理

通过 try-except 块处理错误:

try:
# 业务逻辑
except Exception as e:
logger.error(f"错误信息:{str(e)}")

21. 模板优化

通过缓存中间件优化模板渲染:

from django.template import Template
from django.template.backends.django.DjangoTemplates import DjangoTemplates
from django.template.backends.cache import TemplateCache
templates = TemplateLoader('templates', cache=TemplateCache())
templates = DjangoTemplates(
engines={
'django': templates,
},
)

22. URL 配置

通过 url 函数配置 URL 路径:

from django.urls import url
urlpatterns = [
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 makemigrations
python manage.py migrate

26. 数据清理

通过 truncate 方法清理数据:

Book.objects.truncate()

27. 数据统计

通过 annotate 进行数据聚合:

from django.db.models import Count, Sum
sales_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. 模型关系

通过 ForeignKeyManyToManyField 管理模型关系。

33. 模型验证

通过 Meta 类设置模型验证规则:

class Meta:
rules = {
'title': {'required': True},
}

34. 模型过滤器

通过自定义过滤器筛选数据:

from django.db.models import Q
def 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 Q
cached_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. 模型迁移

通过 makemigrationsmigrate 迁移模型:

python manage.py makemigrations
python manage.py migrate

42. 模型扩展

通过 extensions 属性扩展模型:

from django.db.models import fields
from django.db.models import models
class 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 Pagination
current_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 Q
cached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1)

53. 模型扩展

通过 extensions 属性扩展模型:

from django.db.models import fields
from django.db.models import models
class 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 Pagination
current_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 Q
cached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1)

64. 模型扩展

通过 extensions 属性扩展模型:

from django.db.models import fields
from django.db.models import models
class 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 Pagination
current_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 Q
cached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1)

75. 模型扩展

通过 extensions 属性扩展模型:

from django.db.models import fields
from django.db.models import models
class 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 Pagination
current_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 Q
cached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1)

86. 模型扩展

通过 extensions 属性扩展模型:

from django.db.models import fields
from django.db.models import models
class 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 Pagination
current_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 Q
cached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1)

97. 模型扩展

通过 extensions 属性扩展模型:

from django.db.models import fields
from django.db.models import models
class 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 配置等。

上一篇:Querybase 使用与安装教程
下一篇:PlatON共识方案详解:应用CBFT共识协议,提高共识效率

发表评论

最新留言

很好
[***.229.124.182]2026年05月29日 19时37分49秒