Django模型及Admin
Django简介
什么是Django
Django是一个开源的Python Web框架,由Django Software Foundation开发和维护。Django的目标是让Web开发更加快速、简单和高效,提供了许多内置的功能和库,如ORM、模板引擎、表单处理、认证、管理后台等。
1.2 Django的优点及特点
- 高效快速:Django提供了许多内置的功能和库,可以快速构建复杂的Web应用程序。
- 安全稳定:Django提供了许多安全性功能,如CSRF保护、XSS保护、SQL注入保护等,可以保证Web应用程序的安全性和稳定性。
- 可扩展性:Django提供了许多可扩展的功能和库,如第三方插件、中间件、信号等,可以根据需要扩展和定制Web应用程序。
- 易于维护:Django提供了许多内置的功能和库,可以减少代码量和重复工作,使得Web应用程序易于维护和升级。
- 社区活跃:Django拥有庞大的社区和生态系统,提供了许多第三方插件和库,可以快速解决各种问题和需求。
Django的应用场景
- 大型Web应用程序:Django适用于大型Web应用程序的开发,可以快速构建复杂的Web应用程序。
- CMS系统:Django提供了许多内置的功能和库,如ORM、模板引擎、管理后台等,适用于CMS系统的开发。
- 社交网络:Django提供了许多内置的功能和库,如认证、权限、信号等,适用于社交网络的开发。
- 电子商务:Django提供了许多内置的功能和库,如ORM、表单处理、支付等,适用于电子商务的开发。
Django、Flask和FastAPI对比
- Django:Django是一个全功能的Web框架,提供了许多内置的功能和库,如ORM、模板引擎、表单处理、认证、管理后台等。Django适用于大型Web应用程序的开发,可以快速构建复杂的Web应用程序。Django的缺点是相对于其他框架来说比较重量级,需要一定的学习成本。
- Flask:Flask是一个轻量级的Web框架,提供了基本的功能和库,如路由、模板引擎、请求和响应处理等。Flask适用于小型Web应用程序的开发,可以快速构建简单的Web应用程序。Flask的优点是灵活性高,可以根据需要选择和集成各种库和插件。Flask的缺点是需要手动安装和配置各种库和插件,需要一定的技术水平。
- FastAPI:FastAPI是一个异步高性能Web框架,提供了高性能和易用性的特点,支持异步编程和类型注解。FastAPI适用于需要高性能和高并发的Web应用程序的开发,可以快速构建高效的Web应用程序。FastAPI的优点是性能高、易用性好、文档丰富,支持异步编程和类型注解。FastAPI的缺点是相对于其他框架来说还比较新,生态系统和社区还不够完善。
Django安装和配置
Django安装、创建项目及App
安装Django
pip install django
创建项目
django-admin startproject myproject
创建App
cd myproject
python3 manage.py createapp myapp
注册App:修改myproject/settings.py, 在INSTALLED_APPS中添加myapp
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp',
]
启动开发服务器
python3 manage.py runserver
Django项目结构介绍
myproject /
├── manage.py # 命令行管理工具
├── myapp / # 应用目录
│ ├── __init__.py
│ ├── admin.py # 应用管理后台配置
│ ├── apps.py # 应用配置
│ ├── migrations / # 应用数据库迁移脚本目录
│ ├── models.py # 应用数据库模型配置
│ ├── tests.py # 应用测试脚本
│ └── views.py # 应用接口编写
└── myproject / # 项目目录
├── __init__.py
├── asgi.py # 异步ASGI部署配置
├── settings.py # 项目设置
├── urls.py # 项目总接口路由
└── wsgi.py # WSGI部署配置
此外根据实际需要还可以在myapp中添加
- url.py # 应用子接口路由
- static / # 应用静态文件目录
- templates / # 应用模板目录
- templatetags / # 应用自定义模板标签目录
Django配置文件介绍
- DEBUG:用于开启或关闭调试模式,调试模式下会显示详细的错误信息和调试信息。
- ALLOWED_HOSTS:用于设置允许访问Django应用程序的主机名或IP地址。
- DATABASES:用于配置数据库连接信息,包括数据库类型、主机名、端口号、用户密码等。
- INSTALLED_APPS:用于配置Django应用程序中安装的应用程序列表。
- MIDDLEWARE:用于配置Django应用程序中使用的中间件列表。
- STATIC_URL:用于配置静态文件的URL前缀。
- TEMPLATES:用于配置Django应用程序中使用的模板引擎和模板选项。
- TIME_ZONE:用于配置时区信息,如Asia/Shanghai
- LANGUAGE_CODE:用于配置语言代码,如zh-hans
- STATICFILES_DIRS:用于配置静态文件的目录列表(默认无该项),如 STATICFILES_DIRS=[BASEDIR / 'static']
Django使用MySQL数据库
安装MySQL客户端 pip install mysqlclient 如果安装不上,可以换成pip install pymysql, 并在settings.py同级目录的__init__.py中添加
import pymysql
pymysql.install_as_MySQLdb()
•数据库配置
在settings.py中修改DATABASES配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'myproject', # 需要手动创建库
'USER': 'root',
'PASSWORD': 'passw0rd',
'HOST': 'localhost',
'PORT': '3306'
}
}
Django启用静态服务显示图片
安装pillow
pip install pillow
媒体配置,在settings.py中修改添加media相关配置
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"
启用静态服务URL,在urls.py中修改添加media相关配置
from django.conf.urls.static import static
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Django编写接口
•编写视图函数
•编辑app/views.py,定义接口(视图)
from django.http import JsonResponse
def hello(request):
data = { 'message': 'Hello, World!'}
return JsonResponse(data)
注册接口路由
编辑myproject/urls.py,导入接口并关联接口地址
from django.contrib import admin
from django.urls import path
from myapp import views
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', views.hello, name='hello'),
]
浏览器访问 http://127.0.0.1:8000/hello/ 查看效果。
获取接口参数
获取GET请求Query参数
def hello(request):
msg = request.GET.get(‘msg’)
# ...
获取POST请求JSON数据
def hello(request):
data = json.loads(request.body)
msg = data.get(‘msg’)
# ...
获取POST请求FORM参数
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt # 需要关闭csrf token验证
def hello(request):
msg = request.POST.get(‘msg’)
# ...
获取接口路径参数
url配置中添加参数
# myproject/url.py
...
urlpatterns = [
path('hello/<msg>', views.hello, name='hello'),
]
接口函数中添加对应参数
# myapp/views.py
def hello(request, msg):
# ...
返回不同的响应
返回普通HTTP响应
from django.http import HttpResponse
def hello(request):
html = '<h1>Hello, world!</h1>'
return HttpResponse(html) #支持指定状态码及内容类型
返回JSON响应
from django.http import JsonResponse
def hello(request):
data = {'message': 'Hello, World!'}
return JsonResponse(data)
重定向到其他接口
from django.http import HttpResponseRedirect
def hello(request):
return HttpResponseRedirect('/hi')
渲染并返回HTML模板
{#myapp/templates/hello.html#}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>{{ message }}</h1>
</body>
</html>
# myapp/views.py
from django.shortcuts import render
def hello(request):
data = {'message': 'Hello, World!'}
return render(request, 'hello.html', data)
返回文件
import os
from django.http import FileResponse
from django.conf import settings
def hello(request):
file_path = os.path.join(settings.MEDIA_ROOT, ‘my_file.txt’)
return FileResponse(open(file_path, ‘rb’), as_attachment=True) # 不加as_attachment=True则返回文件原始内容
返回错误常见HTTP错误
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound, HttpResponseServerError
def hello(request):
# return HttpResponse('400 Bad request', status=400)
# return HttpResponseBadRequest('400 Bad request')
# return HttpResponseBadRequest('404 Not found')
return HttpResponseBadRequest('500 Internal Server Error')
Django路由配置
在Django中,路由配置用于将URL映射到相应的视图函数或类。通过路由配置,可以定义应用程序中的URL模式,以便Django能够正确地将请求路由到相应的处理程序。
path
re_path
include
路由名称及反向查找reverse()
redirect()
{% url '' %}
Django模型
什么是Django模型
Django模型是Django应用程序中用于定义数据模型的一种方式。模型是一个Python类,继承自Django提供的models.Model类,用于定义数据表的结构和字段。通过使用Django模型,可以轻松地操作和管理应用程序中的数据。
定义模型
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
publish_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
使用模型操作数据库
book = Book(title='Django for Beginners', author='John Smith', publish_date='2021-01-01', price=29.99)
book.save()
books = Book.objects.all()
for book in books:
print(book.title, book.author, book.publish_date, book.price)
什么ORM
ORM是对象关系映射(Object-Relational Mapping)的缩写,是一种将对象模型和关系数据库模型进行映射的技术。
ORM将关系数据库中的表、列、行等数据结构映射为面向对象的类、属性、方法等数据结构,使得开发人员可以使用面向对象的方式操作数据库,而不需要直接编写SQL语句。
ORM的优点
- 简化开发:·ORM将数据库操作转化为面向对象的操作,使得开发人员可以使用面向对象的方式进行开发,而不需要直接编写SQL语句,简化了开发过程。
- 提高可维护性:ORM将数据库操作封装在对象中,使得代码更加清晰、易于维护和升级。
- 提高可移植性:ORM可以屏蔽不同数据库之间的差异,使得应用程序更加容易移植到不同的数据库平台上。
- 提高安全性:ORM可以防止SQL注入等安全问题,提高了应用程序的安全性。
Django模型的定义
1.定义模型
在Django中,模型是一个Python类,继承自Django提供的models.Model类,用于定义数据表的结构和字段。
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)
publish_date = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
数据库迁移,在定义模型后,需要进行数据库迁移,将模型映射到数据库中的表结构。
python manage.py makemigrations
python manage.py migrate
Django模型内置Meta选项
参考:模型Meta选项
- db_table:表名称
- db_table_comment:[4.2新增]表注释
- ordering:默认排序字段
- verbose_name:显示名称
- verbose_name_plural:显示名称(复数)
- db_tablespace:表空间
- app_label:(外部应用时)所属应用名
- default_manager_name:默认数据管理器名称
- base_manager_name:管理器属性名,默认objects
- default_related_name:默认反向关了名称,默认为_set
- get_latest_by:指定last() / earliest() 获取最近数据依据的字段
- managed:migrate时否处理该表(创建、变更)等,默认为True
- order_with_respect_to:根据指定Freignkey进行排序
- permissions:创建此对象时要输入权限表的额外权限
- default_permissions:默认权限,默值为 ('add', 'change', 'delete', 'view')
- required_db_features:当前连接应具备的数据库特征列表
- required_db_vendor:所支持数据库类型 如[' sqlite ', ' postgresql ‘,'mysql ']
- indexes:索引字段
- unique_together:组合唯一
- constraints:约束列表
- abstract:抽象模型(用于父类,不创建表)
- proxy:代理模型(用于子类,使用父类表数据)
Django模型的定义-字段类型
参考:模型字段参考#字段类型
- AutoField:自增字段
- BigAutoField:大整型自增字段
- SmallAutoField:小整型自增字段
- BinaryField:二进制字段
- BooleanField:真假值字段
- CharField:字符串自动,max_length必填
- TimeField:时间字段
- DateField:日期字段
- DateTimeField:日期时间字段
- DecimalField:数字字段
- DurationField:耗时字段
- EmailField:电子邮箱地址字段
- FileField:文件上传字段
- FilePathField:文件路径字段
- FloatField:浮点数字段
- IntegerField:整数字段
- BigIntegerField:大整数字段
- JSONField:JSON文本字段
- PositiveBigIntegerField:大非负整数字段
- PositiveIntergerField:非负整数字段
- PostimveSmallIntegerField:小非负整数字段
- GenericIPAddressField:通用IP地址字段
- SlugField:slug代表字段
- TextField:文本字段
- URLField:URL字段
- UUIDField:UUID字段
- ForeignKey:外键连接字段,on_delete必填
- ManyToManyField:多对多关系字段
- OneToOneField:一对一关系字段
Django模型的定义-字段选项
参考:模型字段参考#字段选项
- verbose_name:字段名称
- null:是否允许为null,默认为False
- blank:是否允许为空,默认为False
- choices:字段选项,例如:choices = [(0, ‘New’), (1,’Processing’)]
- default:字段默认值
- help_text:字段帮助文本
- primary_key:是否主键
- unique:是否唯一
- related_name:ForeighKey或ManyToManyField,反向连接数据管理器名称
- related_query_name: ForeighKey或ManyToManyField,反向连接查询集名称
- on_delete:ForeighKey,关联删除策略,支持CASCASE(级联删除)、SET_NULL (设置为null)等
- through:ManyToManyField指定中间表
Django模型的使用
在接口(view函数)可以导入模型类以操作该模型(表)数据。
# 创建一条数据
book = Book(title='Django for Beginners', author='John Smith', publish_date='2021-01-01', price=29.99)
book.save()
# 查询所有数据
books = Book.objects.all()
for book in books:
print(book.title, book.author, book.publish_date, book.price)
# 查询单条数据
book = Book.objects.get(title='Django for Beginners')
# 更新数据
book.price = 39.99
book.save()
# 删除数据
book.delete()
Django模型的关系
- 一对一关系(OneToOneField):一对一关系是指一个模型实例只能关联一个另一个模型实例,而另一个模型实例也只能关联一个该模型实例。例如,一个人只能有一个身份证号码,一个身份证号码也只能对应一个人。
- 一对多关系(ForeignKey):一对多关系是指一个模型实例可以关联多个另一个模型实例,但另一个模型实例只能关联一个该模型实例。例如,一个作者可以写多篇文章,但一篇文章只能有一个作者。
- 多对多关系(ManyToManyField):多对多关系是指一个模型实例可以关联多个另一个模型实例,而另一个模型实例也可以关联多个该模型实例。例如,一个学生可以选修多门课程,一门课程也可以被多个学生选修。
一对一关系增删改查
•增加关系:使用OneToOneField字段的create()方法或save()方法增加关系
person = Person.objects.create(name=‘John’) # 创建了一个Person实例
id_card = IDCard.objects.create(number=‘123456789’, person=person) # 将Person实例关联到IDCard实例中
删除关系:使用OneToOneField字段的delete()方法或set()方法删除关系
id_card.person.delete() # 删除IDCard实例与Person实例之间的关系
修改关系:使用OneToOneField字段的save()方法修改关系
new_person = Person.objects.create(name='Tom’)
id_card.person = new_person id_card.save()
查询关系:使用OneToOneField字段进行查询及反向查询
id_card = person.idcard
person = id_card.person # 反向查询
一对多关系增删改查
增加关系:使用ForeignKey字段的create()方法或add()方法增加关系
author = Author.objects.create(name=‘John’) # 创建了一个Author实例
article = Article.objects.create(title=‘Hello’, content=‘World’, author=author) # 将Author实例关联到Article实例中
删除关系:使用ForeignKey字段的delete()方法或set()方法删除关系
article.author.delete() # 删除了Article实例与Author实例之间的关系。
修改关系:使用ForeignKey字段的set()方法修改关系
new_author = Author.objects.create(name=‘Tom’)
article.author = new_author article.save() # 将Article实例的author属性修改为新的Author实例。
查询关系:使用ForeignKey字段的反向查询方法查询关系
author = Author.objects.get(name='John') articles = author.article_set.all()
多对多关系增删改查
增加关系:使用ManyToManyField字段的create()方法或add()方法增加关系
student = Student.objects.create(name=‘John’) # 创建了一个Student实例
course = Course.objects.create(name=‘Math’) student.courses.add(course) # 将Course实例关联到Student实例中
删除关系:使用ManyToManyField字段的remove()方法或clear()方法删除关系
student.courses.remove(course) # 删除了Student实例与Course实例之间的关系。
修改关系:使用ManyToManyField字段的set()方法修改关系
new_course = Course.objects.create(name='English’)
student.courses.set([new_course]) # 将Student实例的courses属性修改为新的Course实例
查询关系:使用ManyToManyField字段的反向查询方法查询关系
course = Course.objects.get(name=‘Math’) # 首先查询了一个Course实例
students = course.student_set.all() # 使用student_set属性查询了与该Course实例相关联的所有Student实例
Django模型数据管理器
在Django中,模型管理器是用于管理模型实例的对象,可以用于查询、创建、更新和删除模型实例。
1.默认管理器
每个Django模型都有一个默认管理器,可以使用objects属性访问。默认管理器提供了一些常用的查询方法,例如all()、filter()和get()等。
# 查询所有图书
Book.objects.all()
# 查询价格大于30的图书
Book.objects.filter(price__gt=30)
# 查询作者为ohn Smith的图书
Book.objects.get(author='John Smith')
2.自定义管理器
可以在模型中定义自定义管理器,以便提供更多的查询方法。自定义管理器必须继承自models.Manager类,并且可以添加自定义的查询方法。
class MyBookManager(models.Manager):
def get_by_author(self, author):
return self.get(author=author)
class Book(models.Model):
# ...
objects = MyBookManager()
# 使用默认管理器
Book.objects.get_by_author('John Smith')
3.自定义管理器查询集
可以使用QuerySet类创建基于查询集的管理器,以便提供更多的查询方法。基于查询集的管理器必须继承自models.QuerySet类,并且可以添加自定义的查询方法。
class MyBookQuerySet(models.QuerySet):
def get_by_author(self, author):
return self.filter(author=author)
class MyBookManager(models.Manager):
def get_queryset(self):
return MyBookQuerySet(self.model, using=self._db)
class Book(models.Model):
# ...
objects = MyBookManager()
# 使用自定义管理器
Book.objects.get_by_author('John Smith')
Django Admin
使用Django管理台
Django管理台(Admin)是一个内置的管理界面,用于管理和操作Django应用程序的后台数据。通过管理台,可以方便地进行数据的创建、编辑、删除等操作,而无需编写额外的代码。
以下是使用Django管理台的基本步骤:
1.创建超级用户:
在终端中,使用python manage.py createsuperuser
命令创建一个超级用户。按照提示输入用户名、电子邮件和密码。
2.启用管理台:
在Django项目的settings.py文件中,确保django.contrib.admin
应用程序已添加到INSTALLED_APPS
设置中。
3.注册模型:
在应用程序的admin.py文件中,注册要在管理台中管理的模型。
from django.contrib import admin
from .models import MyModel
admin.site.register(MyModel) # MyModel是要在管理台中管理的模型。
4.运行开发服务器:
在终端中,使用python manage.py runserver
命令启动开发服务器。
5.访问管理台:
在浏览器中,访问http://localhost:8000/admin/(根据实际的开发服务器地址和端口)以打开管理台登录页面。
ModelAdmin配置
列表页相关配置
- list_display:模型列表页显示的字段,支持id, str
- list_display_links:显示为链接的字段,默认list_display第一个
- list_editable:列表页可编辑字段
- list_filter:过滤器字段,支持CharField、ForeignKey等
- show_full_result_count:过滤后是否显示全部对象数量
- preserve_filters:应用数量变动后是否保持筛选结果
- date_hierarchy:指定日期区间过滤字段
- search_fields:搜索字段
- search_help_text:搜索帮助文本
- paginator:指定分页器
- list_max_show_all:最大显示数量
- list_per_page:分页每页书了
- list_select_related:
- sortable_by:排序字段
- ordering:排序字段
- actions:自定义列表操作
- actions_on_top:自定义列表操作是否在列表上方 显示
- actions_on_bottom:自定义列表操作是否在列表下方显示
- actions_selection_counter:自定义列表操作是否显示选中对象数量
- empty_value_display: 空值显示,默认为”-”
详情页相关配置:
- fields:显示字段,支持嵌套分组
- exclude:排除字段
- readonly_fields:只读字段
- fieldsets:显示字段分组设置
- filter_horizontal:水平过滤框
- filter_vertical:垂直过滤框
- inlines:内联模型
- radio_fields:显示为radio单选框的字段(带choices或ForeighKey字段)
- autocomplete_fields:自动填充字段
- prepopulated_fields:预填充字段映射,例如
- raw_id_fields:显示为原始id的字段(ForeighKey)
- form:自定义模型表单对象
- formfield_overrides:覆盖表单字段
- save_as:是否显示保存按钮
- save_as_continue:是否显示保存并继续编辑按钮
- save_on_top:是否在上方显示保存按钮
- view_on_site:是否显示在站点显示链接
ModelAdmin自定义字段及动作
@admin.display(description=“”)
def colord_status(self, obj):
...
@admin.action(description=””)
def copy_obj(self, request, queryset):
...
使用内联模型InlineModelAdmin
内联模型种类
- admin.TabularInline
- admin.StackedInline
内联模型选项:
- form: 指定表单
- fieldsets:字段集
- fields:表单包含的模型字段
- formfield_overrides:表单覆盖(重写)的模型字段
- exclude:表单排除的模型字段
- filter_horizontal:水平筛选器
- filter_vertical:垂直筛选器
- ordering:排序字段
- prepopulated_fields:预搜索字段
- get_fieldsets():获取字段集
- get_queryset():获取查询集
- radio_fields:单选字段
- readonly_fields:只读字段
- raw_id_fields:原始id字段(适用于外键)
- formfield_for_choice_field()
- formfield_for_foreignkey()
- formfield_for_manytomany()
- has_module_permission()