当前位置: 首页 > news >正文

软件工程在网站建设营销型网站建设教程视频教程

软件工程在网站建设,营销型网站建设教程视频教程,WordPress自动采集翻译插件,重庆建设工程信息网 官网目录 配置环境创建 Django 项目和 APP项目组成  ‍子目录文件组成应用文件组成 配置 settings.py启动项目 数据表创建models.pyDjango-models的常用字段和常用配置 Django-admin 引入admin后台和管理员外键views.pyurls.pypostman接口测试 QuerySetInstance功能APIView 的概念… 目录 配置环境创建 Django 项目和 APP项目组成  ‍子目录文件组成应用文件组成 配置 settings.py启动项目 数据表创建models.pyDjango-models的常用字段和常用配置 Django-admin 引入admin后台和管理员外键views.pyurls.pypostman接口测试 QuerySetInstance功能APIView 的概念views.pyurl.py 序列化器serializersserializer.py 测试Django-DRF 路由组件Django-DRF 自定义函数参考 配置环境 创建虚拟环境 conda create -n erp-env python3.9激活虚拟环境 conda activate erp-envrequirements.txt文件 decorator5.1.1 Django4.2.3 django-debug-toolbar4.1.0 django-extensions3.2.3 django-filter23.2 django-rest-framework0.1.0 djangorestframework3.14.0 drf-spectacular0.26.3Django 是一个 Python web 框架提供许多功能如 ORM、认证、表单、模板等它可以帮助你更快、更轻松地开发 web 应用程序。DRF(django-rest-framework) 是一个基于 Django 的强大而灵活的 RESTful 框架它提供了许多工具和库可帮助你快速开发基于 RESTful API 的 web 应用程序。Django-Filter 是一个基于 Django 的库它提供了一种简单、灵活的方式来过滤 Django 模型的查询集。Django-Filter 的 API 允许开发者使用简单的查询表达式构建和应用复杂的过滤器从而在查询集中选择和排除数据。DRF Spectacular 是 DRF 的 OpenAPI 规范工具。它可以自动构建和生成 OpenAPI 规范文档并提供方便的 API 测试工具使你能够更加轻松地创建、测试和维护 RESTful API。同时它也支持集成 Django Filter允许你通过 URL 参数过滤查询数据。 进入requirements.txt文件所在目录 cd C:\Users\gxx\Desktop\djangolearning安装python库 pip install -r requirements.txt或者 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple创建 Django 项目和 APP 创建项目文件夹 django-admin startproject erp(1) 进入manage.py所在路径 cd C:\Users\gxx\Desktop\djangolearning\erp创建 APP python manage.py startapp test1(2) 或者 进入指定路径 cd C:\Users\gxx\Desktop\djangolearning\erp\apps创建 APP django-admin startapp test2项目组成  ‍ 项目名文件夹子目录下同名子文件夹manage.py文件 manage.py提供了一种命令行工具允许你以多种方式与该Django项目进行交互。如python manage.py help,能列出它所能做的事情。注意此文件一般情况下不需要改动。应用文件夹 子目录文件组成 _init_.py 是一个空文件作用是所在的这个目录可以被当作包使用。settings.py:该Django项目整体配置文件。该文件非常重要建议认真理解这个文件中可用的设置类型及其默认值。urls.py:Django项目的URL设置。可视其为你的django网站的目录。asgi.py与wsgi.py常见的网关接口协议CGIFastCGIWSGIASGI。asgi.py是异步服务器网关接口项目配置文件。ASGI描述了Python Web应用程序和Web服务器之间的通用接口。与WSGI不同的是ASGI允许每个应用程序有多个异步事件。另外ASGI支持同步和异步应用程序。开发人员可以将原有的同步WSGI Web应用程序迁移到ASGI也可以使用ASGI构建新的异步Web应用程序。 应用文件组成 _init_.py 是一个空文件作用同前。 admin.py 文件跟网站的后台管理相关。 models.py 文件跟数据库操作相关。主要用一个 Python 类来描述数据表。运用这个类,你可以通过简单的 Python 的代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的SQL语句。 views.py 包含了页面的业务逻辑接收浏览器请求进行处理返回页面操作相关。 tests.py 文件用于开发测试用例在实际开发中会有专门的测试人员使用。 apps.py 文件夹是django1.10之后增加的通常里面包含对应用的配置。 migrations:django 1.8之后推出的migrations机制使django数据模式管理更容易。migrations机制有两个指令makemigrations和migrate。makemigrations指令是用models里面的model和当前的migrations代码里面的model做对比如果有新的修改就生成新migrations代码。migrate指令是用migrations目录中代码文件和django数据库django_migrations表中的代码文件做对比如果表中没有那就对没有的文件按顺序及依赖关系做migrate apply然后再把代码文件名加进migrations表中。 migrations文件夹 里面自动生成了_init_.py文件 配置 settings.py 加入安装的库和新增的APP test1,rest_framework,django_filters,drf_spectacular,启动项目 启动Django服务 python manage.py runserver点击http://127.0.0.1:8000 数据表创建 模块功能 如前所述models.py文件主要用一个 Python 类来描述数据表。运用这个类,可以通过简单的 Python 代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的SQL语句。在model.py中创建两个表产品分类表和产品信息表。 models.py 产品分类表和产品信息表 from django.db.models import *# Create your models here. ## 产品分类表 class GoodsCategory(Model):产品分类name CharField(max_length64, verbose_name分类名称)remark CharField(max_length64, nullTrue, verbose_name备注, blankTrue)## 产品表 class Goods(Model):产品# 外键category ForeignKey(GoodsCategory, on_deleteSET_NULL, related_namegoods_set, nullTrue, verbose_name产品分类,blankTrue, )# on_deletenumber CharField(max_length32, verbose_name产品编号)name CharField(max_length64, verbose_name产品名称)barcode CharField(max_length32, nullTrue, blankTrue, verbose_name条码)spec CharField(max_length64, nullTrue, blankTrue, verbose_name规格)shelf_life_days IntegerField(nullTrue, verbose_name保质期天数)purchase_price FloatField(default0, verbose_name采购价)retail_price FloatField(default0, verbose_name零售价)remark CharField(max_length128, nullTrue, blankTrue, verbose_name备注)合并数据库 这两个命令是Django框架中的关键命令用于进行数据库迁移。当你修改了Django模型后你需要运行这两个命令以将这些更改应用到数据库中。 python manage.py makemigrations这个命令用于生成迁移脚本。当你更新了模型文件之后需要运行该命令Django会检测模型的改变然后自动生成相应的迁移脚本存储在 migrations/目录下。通常来说你需要针对每个应用运行一次该命令。 python manage.py migrate这个命令用于将迁移脚本应用到数据库中。当你在模型文件中进行更改之后需要先通过 makemigrations命令生成迁移脚本然后运行该命令将这些脚本应用到数据库中。对于新的迁移脚本Django会逐个执行它们从而更新数据库结构。对于已经执行过的脚本Django会跳过它们避免重复执行。 这两个命令是Django框架中非常重要的命令在修改数据库相关内容时必须时刻清醒地记住使用它们。 在终端运行命令 Django-models的常用字段和常用配置 常用字段 CharField 用于存储字符串类型有最大长度限制 IntegerField 用于存储整数类型 FloatField用于存储浮点数类型 BooleanField 用于存储布尔类型 DateField 用于存储日期类型 DateTimeField 用于存储日期和时间类型 ImageField 用于存储图片类型 FileField 用于存储文件类型 ForeignKey 外键 用于表示数据库表之间的关联关系 OneToOneField 一对一 用于表示一对一的关联关系 ManyToManyField 多对多 用于表示多对多的关联关系   ‍ 常用配置 max_length 字段的最大长度限制可以应用于多种不同的字段类型。 verbose_name 字段的友好名称便于在管理员后台可视化操作时使用。 default 指定字段的默认值。 null 指定字段是否可以为空。 nullTrue 设置允许该字段为 NULL 值 blank 指定在表单中输入时是否可以为空白。 choices 用于指定字段的可选值枚举列表,在最上面定义 字段定义 class DeliveryMaterial(Model):class Status(TextChoices):QUALIFIED (qualified, 良品) UNQUALIFIED (unqualified, 不良品)status CharField(max_length32, choicesStatus.choices, defaultStatus.QUALIFIED, verbose_name状态)TextChoices 是 Django 3.0 引入的一个枚举类用于在模型字段中创建可选择的、文本值的选项。 related_name 指定在多对多等关系中反向使用的名称。 on_delete 指定如果外键关联的对象被删除时应该采取什么操作。 Django-admin 引入admin后台和管理员 创建后台 admin 管理员 在终端运行命令 python manage.py createsuperuserpython manage.py runserver打开网址 http://127.0.0.1:8000/admin   ‍ 配置 在admin.py文件中注册你的模型 from django.contrib import admin from .models import * # Register your models here.admin.site.register(Goods) admin.site.register(GoodsCategory)外键 models.py category ForeignKey(GoodsCategory,on_deleteSET_NULL,related_namegoods_set,nullTrue,verbose_name产品分类) on_delete 设置当外键对应的数据被删除时的反应 nullTrue 概念 外键是一种用于建立表之间关联关系的约束通常指的是一个模型中的一个或多个字段的值必须符合另一个模型中对应字段的值。 views.py # Create your views here. from django.shortcuts import render from rest_framework.response import Response from .models import * from rest_framework.decorators import api_view from django.shortcuts import get_object_or_404# Create your views here. # GET # POST# 函数式编程 api_view([POST, GET]) def InsertGoodsCategory(request):category_name request.data.get(分类名字)# 获取分类对象或创建新的分类对象category, created GoodsCategory.objects.get_or_create(namecategory_name)# 判断是否已存在分类if not created:return Response({status: 已存在, goods_category: category_name}, status200)else:return Response({message: fSuccessfully inserted category {category_name}.})api_view([POST, GET]) def FilterGoodsCategory(request):data request.data.get(分类名字)goods GoodsCategory.objects.filter(namedata)if goods.exists():return Response({status: 已存在, goods_category: data}, status200)else:return Response({status: 不存在, goods_category: data}, status404) urls.py 放入路由 import os import sys os.chdir(os.path.dirname(__file__)) sys.path.append(..) from django.contrib import admin from django.urls import path from test1.views import * from django.urls import include from rest_framework import routersurlpatterns [path(admin/, admin.site.urls),path(filtergoodscategory/, FilterGoodsCategory),path(insertgoodscategory/, InsertGoodsCategory),# path(filtergoodscategoryapi/, FilterGoodsCategoryAPI.as_view()),# path(getgoods/, GetGoods.as_view()), ]运行项目 python manage.py runserverpostman接口测试 使用postman针对 insertGoodsCategory/和 filtergoodscategory/API接口进行测试测试结果如下 http://127.0.0.1:8000/insertgoodscategory/http://127.0.0.1:8000/filtergoodscategory/QuerySet 从数据库中查询结果存放的集合称为 QuerySet。 Django ORM用到三个类Manager、QuerySet、Model。每个Model都有一个默认的 manager实例名为objects。Django的ORM通过Model的objects属性提供各种数据操作的接口API并通过 Model.objects 方法返回QuerySet生产符合查询条件的列表列表中包含多个 Instance。 class QuerySet(modelNone, queryNone, usingNone)[source] 其具有两大特色 1 惰性若这个对象中包含了需要的数据且需要使用时它会去DB中获取数据否则不会获取。 比如说在内部创建、过滤、切片和传递一个QuerySet而没有进行真正的数据执行不会真实操作数据库被称为惰性。 2缓存使用同一个查询集第一次使用时会发生数据库的查询然后Django会把结果缓存下来再次使用这个查询集时会使用缓存的数据减少了数据库的查询次数。 操作说明 设定已存在数据表定义如下 class Goods(DjangoPeople): { number CharField(max_length32, verbose_name‘编号’) name CharField(max_length64, verbose_name‘名称’) unit CharField(max_length64, verbose_name‘单位’) remark CharField(max_length256, verbose_name‘备注’) } all() :返回模型的所有对象它的效果等价于不带任何条件的 filter() 方法。 如 DjangoPeople.objects.all() # 查询所有 语句。filter()(**kwargs) 用于返回符合条件的所有数据。 如 DjangoPeople.objects.filter(name“abc”) #取出nameabc的DjangoPeople成员又如 DjangoPeople.objects.filter(name“x”).filter(unit“y”) #取出namex且unity的DjangoPeople成员get() 方法与 filter() 的作用类似用于返回符合条件的单个对象但是可能会返回多个值 delete() 可以删除符合条件的所有对象 如 catagories_to_deleteDjangoPeople.objects.filter(name“abc”)deleted_count categories_to_delete.delete()update() 将符合条件的所有对象的某个字段值进行更新 create() 是 save() 方法的快捷方式用于创建并保存一个新的对象。 如 created_category DjangoPeople.objects.create(nameabc)count() 返回符合条件的对象数量 order_by() 对返回的对象进行排序默认为升序。降序则在字段名前面加负号。 QuerySet其他的其接口定义用法类似这里不再一一赘述需要运用可查阅Django官网。 Instance功能 Instance指的是一个 Django 模型的单个实例也就是数据库中的一行数据。相比于 QuerySet查询集合它是针对单个对象的操作用于创建、更新或者删除单个模型实例。 创建一个对象 Obj Model(attr1val1, attr2val2),Obj.save()更新一个对象 Obj Model.objects.get(idxxx),Obj.attr1 val1Obj.save()删除一个对象 Obj Model.objects.get(idxxx),Obj.delete()QuerySet 适用于需要查找多个对象或进行聚合操作的场景而 Instance 适用于单独对象的创建、修改和删除操作。 APIView 的概念 APIview 是 Django REST Framework 提供的一个视图类。它和 Django 中的 view 类有些相似但是又有一些不同之处。APIview 可以处理基于 HTTP 协议的请求并返回基于内容协商的响应它旨在提供一个易于使用且灵活的方式来构建 API 视图。 views.py 首先self 表示当前实例对象这里指的是视图类的实例对象。 request 表示当前的请求对象包含了客户端发送的信息例如请求头、请求体等。 pk 是 path 参数 int:pk用于获取请求中的产品 ID。 format 表示客户端请求的响应格式例如 JSON、XML 等。这个参数通常不需要指定会根据客户端发送的 Accept 请求头来自动选择响应格式。如果客户端指定了响应格式那么我们可以从请求中获取到这个参数并且做出相应的处理。 在这个方法中我们需要通过 pk 参数获取到对应的产品数据并将其序列化成 JSON 格式并返回给客户端。具体的实现方式可以参考序列化器文档和 Django ORM 文档。 from django.shortcuts import render from rest_framework.response import Response from .models import * from rest_framework.decorators import api_view from django.shortcuts import get_object_or_404 from rest_framework.views import APIView from .serializer import * from rest_framework.decorators import actionfrom django.db.models import Q from rest_framework.viewsets import ModelViewSet#### modelviewset class GoodsCategoryViewSet(ModelViewSet):# 指定查询集用到的数据queryset GoodsCategory.objects.all()# 指定查询集用到的序列化容器serializer_class GoodsCategorySerilizeraction(detailFalse, methods[get])def latest(self, request):latest_obj GoodsCategory.objects.latest(id)print(latest_obj)return Response(helllo 你调用了自定义的函数)action(detailFalse, methods[get, post])def delete_example(self, request):name request.data.get(name)# 删除名称为 name 的商品categories_to_delete GoodsCategory.objects.filter(namename)# 使用delete()方法删除对象deleted_count categories_to_delete.delete()print(fDeleted {deleted_count} categories.)action(detailFalse, methods[get, post])def create_example(self, request):name request.data.get(name)# 使用create()方法创建新的商品分类对象created_category GoodsCategory.objects.create(name)print(Created category:, created_category)# Create your views here.# GET # POST#### 函数式编程 api_view([POST, GET]) def FilterGoodsCategory(request):if request.method GET:print(request.method)if request.method POST:print(request.method)data request.data.get(分类名字)goods_category get_object_or_404(GoodsCategory, namedata)print(goods_category)# ans Goods.objects.filter(categorygoods_category).all().values()# print(ans)goods Goods.objects.filter(categorygoods_category)serializer GoodsSerializer(goods, manyTrue) # 请确保导入合适的序列化器# 输出对象 和 数据类型print(object type:, type(Goods.objects))print(object.all() type:, type(Goods.objects.all()))print(object.all().values type:, type(Goods.objects.all().values()))# Instanceprint(object.get(id1) type:, type(Goods.objects.get(id1)))return Response(serializer.data)# return Response(ans)api_view([POST, GET]) def InsertGoodsCategory(request):category_name request.data.get(分类名字)# 获取分类对象或创建新的分类对象category, created GoodsCategory.objects.get_or_create(namecategory_name)# 判断是否已存在分类if not created:return Response({status: 已存在, goods_category: category_name}, status200)else:return Response({message: fSuccessfully inserted category {category_name}.})api_view([POST, GET]) def FilterGoodsCategory(request):data request.data.get(分类名字)goods GoodsCategory.objects.filter(namedata)if goods.exists():return Response({status: 已存在, goods_category: data}, status200)else:return Response({status: 不存在, goods_category: data}, status404)#### APIView class GetGoods(APIView):def get(self, request):data Goods.objects.all()serializer GoodsSerializer(instancedata, manyTrue)print(serializer.data)return Response(serializer.data)def post(self, request):# 从请求数据中提取字段request_data {category: request.data.get(Goodscategory),number: request.data.get(number),name: request.data.get(name),barcode: request.data.get(barcode),spec: request.data.get(spec),shelf_life_days: request.data.get(shelf_life_days),purchase_price: request.data.get(purchase_price),retail_price: request.data.get(retail_price),remark: request.data.get(remark),}# 使用 create() 方法创建新的商品对象new_goods Goods.objects.create(**request_data)# 对创建的对象进行序列化并作为响应返回serializer GoodsSerializer(instancenew_goods)return Response(serializer.data)# 面向对象编程 class FilterGoodsCategoryAPI(APIView):# request 表示当前的请求对象# self 表示当前实例对象def get(self, request, formatNone):print(request.method)return Response(ok)def post(self, request, formatNone):print(request.method)return Response(ok)def put(self, request, formatNone):print(request.method)return Response(ok)url.py import os import sys os.chdir(os.path.dirname(__file__)) sys.path.append(..)from django.contrib import admin from django.urls import pathfrom test1.views import * from django.urls import include from rest_framework import routers# 创建DefaultRouter对象用于生成路由 router routers.DefaultRouter() # 将视图集注册到路由器上字符串里的是URL路径的前缀 router.register(GoodsCategory, GoodsCategoryViewSet)urlpatterns [path(admin/, admin.site.urls),path(filtergoodscategory/, FilterGoodsCategory),path(insertgoodscategory/, InsertGoodsCategory),path(filtergoodscategoryapi/, FilterGoodsCategoryAPI.as_view()),path(getgoods/, GetGoods.as_view()), ] # 把生成的url 添加到项目的url配置中 urlpatterns router.urls 序列化器serializers 序列化器的作用 序列化将 queryset 和 instance 转换为 json/xml/yaml 返回给前端 反序列化与序列化则相反 定义序列化器 定义类继承自 Serializer 通常新建一个 serializers.py 文件 撰写序列化内容 suah as 目前只支持 read_only 只读 label 字段说明信息 max_length 最大长度 serializer.py 在应用文件夹(test1)下新建serializer.py文件 from rest_framework.serializers import * from .models import *class GoodsCategorySerilizer(ModelSerializer):class Meta:model GoodsCategoryfields __all__# 构建产品序列化器 class GoodsSerializer(ModelSerializer):# 外键字段相关的数据 需要单独写category GoodsCategorySerilizer()class Meta:# 指定需要序列化的表model Goods# 指定我们需要序列化的字段fields __all__a. 序列化单个对象 获取对象 data Goods.objects.get(id1) 创建序列化器 sberializer GoodsSerializer(instancedata) 转换数据 print(serializer.data) 注意点 instance是一个参数用于指定要序列化或反序列化的 Python 对象。具体来说它是一个类实例(Class Instance),通常是指一个从数据库或其他数据源中检索出来的模型实例(Model Instance)。 当我们需要将一个模型实例转换为 JSON 或其他格式时可以使用 Django 的序列化器(Serializer)来实现。 输出 {id: 1, number: 1, name: 第一个产品, purchase_price: 100.0, retail_price: 150.0, remark: 测试产品}b. 序列化多个对象 data Goods.objects.all() # 获取对象# 创建序列化器many表示序列化多个对象默认为单个serializer GoodsSerializer(instancedata,manyTrue)print(serializer.data) # 转换数据# 输出[OrderedDict([(id, 1), (number, 1), (name, 第一个产品), (purchase_price, 100.0), (retail_price, 150.0), (remark, 测试产品)]), OrderedDict([(id, 2), (number, 123), (name, 产品2), (purchase_price, 123.0), (retail_price, 4123.0), (remark, 测试产品2)])] 测试 python manage.py runserver打开网页http://127.0.0.1:8000/admin/ http://127.0.0.1:8000/getgoods/Django-DRF 路由组件 DefaultRouter是Django REST framework中提供的一个路由器类用于自动生成URL路由。 路由器是将URL与视图函数或视图集关联起来的一种机制。Django REST framework的路由器通过简单的配置可以自动生成标准的URL路由从而减少了手动编写URL路由的工作量。 DefaultRouter的使用方法 urls.py 使用 routers.DefaultRouter()创建了一个默认的路由器对象并使用 router.register()方法注册了一个视图集GoodsCategoryViewSet。这样可以自动为这个视图集生成对应的URL路由并将其添加到 urlpatterns中。 http://127.0.0.1:8000/GoodsCategory/Django-DRF 自定义函数 自定义函数是什么? from rest_framework.decorators import action action 是 Django REST framework 中的一个装饰器用于将自定义函数转换为视图集的一个动作。action 装饰器提供了一种定义自定义函数的方式这些函数并不直接对应于标准的 CRUD 操作Create-Read-Update-Delete而是实现一些其他的自定义行为或业务逻辑。 “action 装饰器”用于在 ViewSet 中创建自定义动作custom action为 ViewSet 提供了更灵活应用且 action 只在ViewSet视图集中生效。视图集中附加action装饰器可接收两个参数 1methods: 声明该action对应的请求方式. 2detail: True/False声明该action的路径是否是action对应的请求方式。 其中detailFalse 表示该动作不需要处理单个对象而是处理整个集合 被 action 装饰的函数需要作为方法定义在视图集类中并且在使用 router.register() 注册视图集时需要指定 basename 参数以确保该动作的 URL 能够正确映射到视图集。 参考 https://github.com/Joe-2002/sweettalk-django4.2#readme
http://www.zqtcl.cn/news/43808/

相关文章:

  • 长沙微交易网站建设深圳效果好的免费网站建设
  • 上海企炬做的网站网站开发人员工资
  • 网站建设的探讨与研究免费资源源码网站
  • 网站开发人员职能响应式网站建设如何
  • 刚做的网站为什么百度搜不到做免费的网站教程
  • 徐闻网站建设公司北京装修公司网站建设
  • 湖州做网站的公司制作网站的技术
  • 怎么键卖东西的网站做竞价的网站做优化有效果吗
  • 广药网站建设试题大连 响应式网站制作
  • 直播网站源码免费百度网页版 入口
  • 大神做的动漫网站什么是网店
  • 网站开发 法律申明wordpress python 自动
  • 杭州俄语网站建设中工信融营销型网站建设
  • 如何查询网站被百度收录情况微信开发小程序开发网站建设
  • 网站建设字体颜色代码昆明专业网站建设的公司
  • 建设网站对公司起什么作用是什么意思四川煤矿标准化建设网站
  • 广州割双眼皮网站建设网站链接如何做二维码
  • 建设部网站官网考试北京建站模板公司
  • 宁波网站设计公司加强网站网络安全建设
  • 西安至诚网站建设策划设计网站
  • 许昌哪个网站做苗木theme my login wordpress
  • 贵阳建站公司模板企业建网站需要准备哪些资料呢
  • 保险代理人做网站商务网站安全方案设计
  • 网站做好后怎么做seowordpress怎么做301跳转
  • 网站公司哪家最专业长春企业网站建设公司
  • 小说网站搭建教程做网站的技术要求高吗
  • 推广公司网站手机版的网站制作
  • 南部网站建设免费宣传平台
  • 1688代加工官方网站双流区的规划建设局网站
  • 手机网站 教程云建站app