本文共 16843 字,大约阅读时间需要 56 分钟。
request.GET 是 Django 中用来接收 GET 请求参数的对象,支持多值字段(如 checkboxes)。
print(request.GET) # 输出:
print(request.GET) # 输出:
request.GET["name"] = "jerd"print(request.GET) # 输出:
print(request.GET.urlencode()) # 输出: 'page=2&name=jerd'
import copyparams = copy.deepcopy(request.GET)params["name"] = "zhao"print(params) # 输出:
默认情况下,request.GET 的 mutable 属性为 False,无法直接修改。通过设置 request.GET._mutable = True,可以实现修改操作。
以下是如何在 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="作者")
通过以下方式可以获取模型表的 app 名和表名:
from app01 import modelsapp_name = models.Book._meta.app_label # 获取 app 名model_name = models.Book._meta.model_name # 获取 表名
通过字段名获取字段对象:
field_obj = models.Book._meta.get_field("title")print(field_obj.verbose_name) # 输出: "书名" 通过关联字段查询关联表中的所有对象:
related_data = publisher.rel.to.objects.all()
使用 Q 对象可以进行复杂查询:
from django.db.models import Q# 查询名称为 "go" 且价格不是 100 的书籍Book.objects.filter(Q(title="go") & ~Q(price=100))
通过 Q 对象可以实现以下操作:
Book.objects.filter(Q(title="go") | Q(price=100))
q = Q()q.children.append(("title", "go"))Book.objects.filter(q) 通过 Q.children 动态添加查询条件:
q = Q()q.children.append(("price", 100))Book.objects.filter(q) 可以通过 values 方法获取字段值:
queryset = Book.objects.filter(title="go")print([item.title for item in queryset.values()])
{% include 'base.html' %} {% extends 'base.html' %} {% block page-css %}{% endblock %} 以下是一个 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)
在模板中引入静态资源:
以下是一个完整的模型定义示例:
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="作者")
通过 ForeignKey 和 ManyToManyField 实现数据关联:
publisher = models.ForeignKey(to="Publish", on_delete=models.CASCADE)authors = models.ManyToManyField(to="Author")
通过过滤器进行数据筛选:
data_list = Book.objects.filter(publish_date__year=2023)
使用 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) 使用 Pagination 实现分页功能:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get("page")pagination = Pagination(current_page, total_count, per_page=3) 通过 {% extends 'base.html' %} 实现模板继承。
以下是一个 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)
通过过滤器实现模型表的筛选:
# 按照出版日期排序data_list = Book.objects.filter(publish_date__year=2023).order_by('publish_date') 通过动态构造查询条件:
from django.db.models import Qqueryset = Book.objects.filter( Q(title="go") & (Q(price=100) | Q(price=200)))
通过 values 方法导出数据:
data = list(Book.objects.all().values())
使用 python manage.py migrate 进行数据库迁移。
通过 dump 命令备份数据库:
python manage.py dumpdb
通过 restore 命令恢复数据库:
python manage.py restoredb
通过 pip install 安装第三方库:
pip install django-environ
通过 .env 文件设置环境变量:
from django.conf import settingsimport ossettings('DJANGO_SETTINGS_MODULE', 'your_project.settings') 通过 logging 模块记录日志:
import logginglogger = logging.getLogger('your_project')logger.info("系统启动了") 通过 try-except 块处理错误:
try: # 业务逻辑except Exception as e: logger.error(f"错误信息:{str(e)}") 通过缓存中间件优化模板渲染:
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, },) 通过 url 函数配置 URL 路径:
from django.urls import urlurlpatterns = [ url(r'^admin/', admin.site.urls),]
通过 permissions 字典设置访问权限:
permissions = { 'add': ['add'], 'change': ['change'], 'delete': ['delete'],} 通过 groups 字典设置角色权限:
groups = { 'admin': ['add', 'change', 'delete'],} 通过 migrate 命令迁移模型:
python manage.py makemigrationspython manage.py migrate
通过 truncate 方法清理数据:
Book.objects.truncate()
通过 annotate 进行数据聚合:
from django.db.models import Count, Sumsales_data = Book.objects.values('title').annotate(sales=Count('id')).order_by('sales') 通过 order_by 方法排序:
data_list = Book.objects.filter(publish_date__year=2023).order_by('publish_date') 通过 filter 方法进行过滤:
data_list = Book.objects.filter(title__contains='go')
通过 update 方法批量更新数据:
data_list.update(price=998)
通过 delete 方法批量删除数据:
data_list.delete()
通过 ForeignKey 和 ManyToManyField 管理模型关系。
通过 Meta 类设置模型验证规则:
class Meta: rules = { 'title': {'required': True}, } 通过自定义过滤器筛选数据:
from django.db.models import Qdef is_active_filter(queryset): return queryset.filter(status='active')
通过 iterator 方法遍历数据:
for book in Book.objects.iterator(): print(book.title)
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 通过 update 方法批量更新数据:
Book.objects.filter(title='go').update(price=100)
通过 delete 方法批量删除数据:
Book.objects.filter(title='go').delete()
通过 restoredb 命令恢复数据库:
python manage.py restoredb
通过 dumpdb 导出数据库:
python manage.py dumpdb
通过 makemigrations 和 migrate 迁移模型:
python manage.py makemigrationspython manage.py migrate
通过 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)
通过 field 属性访问模型字段:
field_obj = models.Book._meta.get_field('title')print(field_obj.verbose_name) # 输出: "书名" 通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 通过 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)
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 通过 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)
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 通过 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)
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 通过 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)
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
通过 order_by 方法排序模型数据:
data_list = Book.objects.filter(title='go').order_by('title') 通过 Pagination 实现分页:
from Xadmin.service.Pagination import Paginationcurrent_page = request.GET.get('page')pagination = Pagination(current_page, total_count, per_page=10) 通过 bulk_create 方法批量创建数据:
bulk_data = [ Book(title='书名1', price=100), Book(title='书名2', price=200),]Book.objects.bulk_create(bulk_data)
通过 bulk_update 方法批量更新数据:
bulk_data = [ Book(id=1, price=100), Book(id=2, price=200),]Book.objects.bulk_update(bulk_data)
通过 bulk_delete 方法批量删除数据:
bulk_data = [1, 2]Book.objects.bulk_delete(bulk_data)
通过 iterator 方法遍历模型数据:
for book in Book.objects.iterator(): print(book.title)
通过 cache 方法缓存查询结果:
from django.db.models import Qcached_books = Book.objects.filter(title='go').values('title').annotate(count=Count('id')).cache_to(1) 通过 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)
通过 field 属性操作模型字段:
field = models.Book._meta.get_field('title')print(field.name) # 输出: 'title' 通过 related 属性访问关联对象:
publisher = models.Book._meta.get_field('publisher')print(publisher.rel.to.model) # 输出: Publish 通过 filter 方法筛选模型数据:
data_list = Book.objects.filter(title__contains='go')
通过以上内容,可以全面了解 Django 开发中的常用实用技巧,包括 QueryDict、ORM 模型表、Q 查询、Xadmin 配置等。
转载地址:http://vrtfk.baihongyu.com/