...

Django模型及Admin

Django简介

什么是Django

Django是一个开源的Python Web框架,由Django Software Foundation开发和维护。Django的目标是让Web开发更加快速、简单和高效,提供了许多内置的功能和库,如ORM、模板引擎、表单处理、认证、管理后台等。

image

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

访问 http://127.0.0.1:8000/

image

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语句。

image

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):多对多关系是指一个模型实例可以关联多个另一个模型实例,而另一个模型实例也可以关联多个该模型实例。例如,一个学生可以选修多门课程,一门课程也可以被多个学生选修。

image

一对一关系增删改查

•增加关系:使用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/(根据实际的开发服务器地址和端口)以打开管理台登录页面。

image

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

参考:Django管理站点#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()
posted @ 2023-10-08 14:21  韩志超  阅读(168)  评论(0编辑  收藏  举报