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

做网站niche微网站如何做推广

做网站niche,微网站如何做推广,上海 有哪些做网站的公司好,新网站建设银行提升转账额度像是上一章我们很少会通过页面点击去添加和绑定关系表#xff0c;更多的时候都是通过django的语法实现#xff0c;接下来我们做一个案例 django rom是怎么操作外键关系的 创建mode模型表 Django_demo/mgr/models.py # 国家表 class Country(models.Model):name models.Cha… 像是上一章我们很少会通过页面点击去添加和绑定关系表更多的时候都是通过django的语法实现接下来我们做一个案例 django rom是怎么操作外键关系的 创建mode模型表 Django_demo/mgr/models.py # 国家表 class Country(models.Model):name models.CharField(max_length100)# 学生表 country 字段是国家表的外键形成一对多的关系 class Student(models.Model):name models.CharField(max_length100)grade models.PositiveSmallIntegerField()country models.ForeignKey(Country,on_deletemodels.PROTECT) python manage.py makemigrations python manage.py migrate 添加测试数据 python manage.py shell #注意应用名称 from paas.models import * c1 Country.objects.create(name中国) c2 Country.objects.create(name美国) c3 Country.objects.create(name法国) Student.objects.create(name白月, grade1, countryc1) Student.objects.create(name黑羽, grade2, countryc1) Student.objects.create(name大罗, grade1, countryc1) Student.objects.create(name真佛, grade2, countryc1) Student.objects.create(nameMike, grade1, countryc2) Student.objects.create(nameGus, grade1, countryc2) Student.objects.create(nameWhite, grade2, countryc2) Student.objects.create(nameNapolen, grade2, countryc3) 一、外键表使用 1、字段访问 #获取student表中 name白月 的数据 s1 Student.objects.get(name白月)#将拿到的数据通过外键直接获取到对应外键表的name字段数据并输出 s1.country.name 案例 s1 Student.objects.get(name白月) s1.country.name 中国 2、单个字段过滤 如果我们想要查询学生表中所有关于1年纪的学生对应表字段是grade 年纪 Student.objects.filter(grade1).values() 返回 QuerySet [{id: 1, name: 白月, grade: 1, country_id: 1}, {id: 3, name: 大罗, grade: 1, country_id: 1}, {id: 5, name: Mike, grade: 1, country_id: 2}, { id: 6, name: Gus, grade: 1, country_id: 2}]3、多字段过滤 如果我要同时实现多个条件呢比如同时满足一年级, 并且国籍是中国的学生 我们不能直接添加多个选项  Student.objects.filter(grade1,country中国) 因为Student表中 country 并不是国家名称字符串字段而是一个外键字段对应 Country 表中 id 字段或许我们可以和上一张用sql语句一样先查id然后在查其他信息 cn Country.objects.get(name中国) Student.objects.filter(grade1,country_idcn.id).values()#或者cn Country.objects.get(name中国) Student.objects.filter(grade1,countrycn).values() 返回 cn Country.objects.get(name中国) Student.objects.filter(grade1,country_idcn.id).values() QuerySet [{id: 1, name: 白月, grade: 1, country_id: 1}, {id: 3, name: 大罗, grade: 1, country_id: 1}] cn Country.objects.get(name中国) Student.objects.filter(grade1,countrycn).values() QuerySet [{id: 1, name: 白月, grade: 1, country_id: 1}, {id: 3, name: 大罗, grade: 1, country_id: 1}] 4、多字段过滤优化 但是上面的方法其实相对来说过于繁琐并且需要查询两次性能不高 Django ORM 中对外键关联有更方便的语法使用外键 双下划线 字段名称 Student.objects.filter(grade1,country__name中国).values() 返回 QuerySet [{id: 1, name: 白月, grade: 1, country_id: 1}, {id: 3, name: 大罗, grade: 1, country_id: 1}] 5、过滤优化--指定显示字段 如果返回结果只需要 学生姓名 和 国家名两个字段可以这样指定values内容 Student.objects.filter(grade1,country__name中国).values(name,country__name) 返回 QuerySet [{name: 白月, country__name: 中国}, {name: 大罗, country__name: 中国}] 6、字段显示重命名 有个问题我们返回数据的字段是country__name 这样的双下划线很奇怪有时候前后端定义好了接口格式必须让用countryname的话就需要去做字段的重命名 from django.db.models import F# annotate 可以将表字段进行别名处理 Student.objects.annotate(countrynameF(country__name),studentnameF(name))\.filter(grade1,countryname中国).values(studentname,countryname) 7、反向访问 Django ORM中关联表正向关系是通过表外键字段或者多对多表示 而反向访问则是通过将model模板名称转换成小写表示的比如说你已经获取到了某个国家信息需要通过国家信息反向查看属于这个国家的学生数据 案例 #声明获取国家表中name字段为中国的数据 cn Country.objects.get(name中国)#先将要查看的表改为全小写,并且声明_set来获取所有的反向外键关联对象 cn.student_set.all() 返回 cn Country.objects.get(name中国) cn.student_set.all() QuerySet [Student: Student object (1), Student: Student object (2), Student: Student object (3), Student: Student object (4)] 小知识 Django还给出了一个方法是在定义Model的时候外键字段使用 related_name 参数 #国家表 class Country(models.Model):name models.CharField(max_length100)# country 字段是国家表的外键形成一对多的关系 class Student(models.Model):name models.CharField(max_length100)grade models.PositiveSmallIntegerField()country models.ForeignKey(Country,on_delete models.PROTECT,# 指定反向访问的名字related_namestudents) python manage.py makemigrations python manage.py migrate 查询 cn Country.objects.get(name中国) students cn.students.all()#拿到的值循环存储并且输出 student_names [student.name for student in students]print(student_names) 返回 print(student_names) [白月, 黑羽, 大罗, 真佛] 8、反向过滤 如果我们想要获取所有一年纪学生的国家名称呢同样可以依靠复合查询实现 # 先获取所有的一年级学生id列表 country_ids Student.objects.filter(grade1).values_list(country, flatTrue)# 再通过id列表使用 id__in 过滤 Country.objects.filter(id__incountry_ids).values() 存在的问题就是重复请求造成性能下降 用Django ORM 的方法 Country.objects.filter(students__grade1).values() 返回 Country.objects.filter(students__grade1).values() QuerySet [{id: 7, name: 中国}, {id: 7, name: 中国}, {id: 8, name: 美国}, {id: 8, name: 美国}] 发现存在重复的数据我们使用 .distinct() 去重 Country.objects.filter(students__grade1).values().distinct() QuerySet [{id: 7, name: 中国}, {id: 8, name: 美国}] 注意 我们前面在定义学生表时, 使用了related_name students 去指定了反向关联students 所以这里通过国家表查询学生表数据的时候使用的字段名称是students__grade 的反向关联名称 如果定义时没有指定related_name 则应该使用 表名转化为小写 就是这样 Country.objects.filter(student__grade1).values() 二、实现项目代码 我们在 mgr 目录下面新建 order.py 处理 客户端发过来的 列出订单、添加订单 的请求 1、添加增删改查主体程序 vi Django_demo/mgr/order.py from django.http import JsonResponse from django.db.models import F from django.db import IntegrityError, transaction# 导入 Order 对象定义 from paas.models import Order,OrderMedicineimport jsondef dispatcherorder(request):# 根据session判断用户是否是登录的管理员用户if usertype not in request.session:return JsonResponse({ret: 302,msg: 未登录,redirect: /mgr/sign.html},status302)if request.session[usertype] ! mgr:return JsonResponse({ret: 302,msg: 用户非mgr类型,redirect: /mgr/sign.html},status302)# 将请求参数统一放入request 的 params 属性中方便后续处理# GET请求 参数 在 request 对象的 GET属性中if request.method GET:request.params request.GET# POST/PUT/DELETE 请求 参数 从 request 对象的 body 属性中获取elif request.method in [POST,PUT,DELETE]:# 根据接口POST/PUT/DELETE 请求的消息体都是 json格式request.params json.loads(request.body)# 根据不同的action分派给不同的函数进行处理action request.params[action]if action list_order:return listorder(request)elif action add_order:return addorder(request)# 订单 暂 不支持修改 和删除else:return JsonResponse({ret: 1, msg: 不支持该类型http请求}) 2、添加路由 vi  Django_demo/mgr/urls.py urlpatterns [...path(orders, dispatcherorder), # 加上这行... ] 3、定义添加订单函数 接下来我们添加函数 addorder来处理添加订单请求首先我们要了解的是 每次添加一个订单都需要在2张表Order 和 OrderMedicine 中添加记录 订单表和中间表 我们给两张表添加记录就会往数据库写两次如果中有一次写入失败了就会形成脏数据 而对应解决这个问题的办法就是利用数据库事务的机制 什么是事务 把一批数据库操作放在 事务 中 该事务中的任何一次数据库操作 失败了 数据库系统就会让 整个事务就会发生回滚撤销前面的操作 数据库回滚到这事务操作之前的状态 在django中使用事务机制 直接通过关键字with transaction.atomic()  即可实现数据库批量操作 Django_demo/mgr/order.py def addorder(request):info request.params[data]# 从请求消息中 获取要添加订单的信息# 并且插入到数据库中#设置事务with transaction.atomic():new_order Order.objects.create(nameinfo[name] ,customer_idinfo[customerid])batch [OrderMedicine(order_idnew_order.id,medicine_idmid,amount1)for mid in info[medicineids]]# 在多对多关系表中 添加了 多条关联记录OrderMedicine.objects.bulk_create(batch)return JsonResponse({ret: 0,id:new_order.id}) 只要是在 with transaction.atomic() 下面 缩进部分的代码对数据库相关的操作都视为在同一个事务中如果其中有任何一步数据操作失败了 前面的操作都会回滚这样就解决了多次写入失败导致的脏数据问题 代码说明 batch [OrderMedicine(order_idnew_order.id,medicine_idmid,amount1)for mid in info[medicineids]]# 在多对多关系表中 添加了 多条关联记录OrderMedicine.objects.bulk_create(batch) 正常来说OrderMedicine 对应的是订单和药品的多对对记录关系表要在多对多表中加上关联记录就是添加一条记录直接写入即可如下 OrderMedicine.objects.create(order_idnew_order.id,medicine_idmid,amount1) 但你实际上去买药的时候很少会单独买一样多少要带点其他的 但是我们如果直接用循环把去写入上面的语句循环几次插入几次那么多次写入也会影响性能我们可以使用django中的bulk_create 把多条数据的插入放在一个SQL语句中完成 batch [OrderMedicine(order_idnew_order.id,medicine_idmid,amount1) for mid in info[medicineids]]# 在多对多关系表中 添加了 多条关联记录 OrderMedicine.objects.bulk_create(batch) 三、ORM 外键关联 接下来我们编写listorder 函数用来处理 列出订单请求请求格式如下 [{id: 1, name: 华山医院订单001, create_date: 2018-12-26T14:10:15.419Z,customer_name: 华山医院,medicines_name: 青霉素},{id: 2, name: 华山医院订单002, create_date: 2018-12-27T14:10:37.208Z,customer_name: 华山医院,medicines_name: 青霉素 | 红霉素 } ] 1、基于接口案例返回值 其中 ‘id’,’name’,‘create_date’ 这些字段的内容获取很简单order表中就有这些字段 def listorder(request):# 返回一个 QuerySet 对象 包含所有的表记录qs Order.objects.values(id,name,create_date)return JsonResponse({ret: 0, retlist: newlist}) 但是customer_name 客户名称 medicines_name 药品名称是在订单表里面没有的我们需要通过类似前面的方法从订单表的外键customer 获取到客户表的name字段方法就是模型名称小写 双下划线 字段名称 def listorder(request):qs Order.objects\.values(id,name,create_date,# 两个下划线表示取customer外键关联的表中的name字段的值customer__name)# 将 QuerySet 对象 转化为 list 类型retlist list(qs)return JsonResponse({ret: 0, retlist: retlist}) 同样的道理 订单对应 的药品 名字段是多对多关联 也同样可以用 两个下划线 获取 关联字段的值 Django_demo/mgr/order.py  def listorder(request):qs Order.objects\.values(id,name,create_date,customer__name,# 两个下划线表示取medicines 关联的表中的name字段的值# 如果有多个就会产生多条记录medicines__name)# 将 QuerySet 对象 转化为 list 类型retlist list(qs)return JsonResponse({ret: 0, retlist: retlist}) 2、重命名返回字段 这个是能返回数据了但存在的问题是双下划线和接口要求的单下划线不同需要通过annotate做一下重命名 from django.db.models import Fdef listorder(request):# 返回一个 QuerySet 对象 包含所有的表记录qs Order.objects\.annotate(customer_nameF(customer__name),medicines_nameF(medicines__name))\.values(id,name,create_date,customer_name,medicines_name)# 将 QuerySet 对象 转化为 list 类型retlist list(qs)return JsonResponse({ret: 0, retlist: retlist}) 3、去除订单内多个不同药品 如果一个订单里面有多个药品就会产生多条记录 这不是我们要的。 根据接口一个订单里面的多个药品 用 竖线 隔开 def listorder(request):# 返回一个 QuerySet 对象 包含所有的表记录qs Order.objects\.annotate(customer_nameF(customer__name),medicines_nameF(medicines__name))\.values(id,name,create_date,customer_name,medicines_name)# 将 QuerySet 对象 转化为 list 类型retlist list(qs)# 可能有 ID相同药品不同的订单记录 需要合并newlist []id2order {}for one in retlist:orderid one[id]if orderid not in id2order:newlist.append(one)id2order[orderid] oneelse:id2order[orderid][medicines_name] | one[medicines_name]return JsonResponse({ret: 0, retlist: newlist})4、测试--获取订单信息 import requests,pprint#添加认证 payload {username: root,password: 12345678 } #发送登录请求 response requests.post(http://127.0.0.1:8000/api/mgr/signin,datapayload) #拿到请求中的认证信息进行访问 set_cookie response.headers.get(Set-Cookie)# 构建添加 客户信息的 消息体是json格式 payload {action:list_order, } urlhttp://127.0.0.1:8000/api/mgr/orders/if set_cookie:# 将Set-Cookie字段的值添加到请求头中headers {Cookie: set_cookie}# 发送请求给web服务response requests.post(url,jsonpayload,headersheaders)pprint.pprint(response.json())返回 {ret: 0,retlist: [{create_date: 2023-10-25T03:08:00Z,customer_name: zhangsan,id: 5,medicines_name: gmkl,name: test}]} 5、测试--添加订单信息 import requests,pprint#添加认证 payload {username: root,password: 12345678 } #发送登录请求 response requests.post(http://127.0.0.1:8000/api/mgr/signin,datapayload) #拿到请求中的认证信息进行访问 set_cookie response.headers.get(Set-Cookie)# 构建添加 客户信息的 消息体是json格式 payload {action:add_order, #模式改为添加data: {name: 天山订单, #订单名称自定义customerid: 1, #客户表中的id值medicineids: [6] #这个是药品表中的id值} } urlhttp://127.0.0.1:8000/api/mgr/orders/if set_cookie:# 将Set-Cookie字段的值添加到请求头中headers {Cookie: set_cookie}# 发送请求给web服务response requests.post(url,jsonpayload,headersheaders)pprint.pprint(response.json())四、特殊字段参数使用 1、唯一性约束处理 我在实际使用的是时候为数据的一致性我给好几个字段都添加了唯一性约束 ip_address modes.CharField(max_length200,uniqueTrue) 但是在写入的时候如果某个字段发现因为已经有相同数据程序就会崩掉我们要就不能直接使用create去添加数据而是改用get_or_create 案例 #处理数据逻辑 obj, created clusterINFO.objects.get_or_create(唯一性字段传入的值比如ip, 唯一性字段2传入的值2, #表内其他非一致性字段defaults{other_field: other_value} )上面这个方法当发现已经有字段时则会给created变量返回一个值为false如果发现可以正常写入就会返回一个true 2、传入值处理 一开始总是陷入一个误区想着表内要啥数据就从客户端传啥数据 payload {action:list_order,data: {key: valuekey: value} } 比方说我要添加集群中的node数据肯定要确保有这个集群名称吧还要确定下集群的园区是什么这些都不是node表里面有的但也要跟随传输过去处理 #拿到请求后先去集群表里面去查环境和集群名对应的字段数据 cn 集群表.objects.get(环境 集群名)#到到的cn如果没有报错就是存放着对应环境集群那一行的数据 cn.id 就能拿到id值了剩下的就是写入#给node表插入数据 obj, created clusterINFO.objects.get_or_create(...defaults{node表关联的外键字段_id: cn.id #给node表外键提供主键表的id值#这块外键的字段名要加_id表示外键表名} )3、前端代码访问api数据 把这个文件扔到templates模板目录下面定义个路由从页面显示出来在页面打开的时候自动去获取订单表信息循环打印出来 html headtitleYour Page Title/title /head body h1Your Page Content/h1div idlist-container/div!-- 将 JavaScript 代码放在 script 标签中 -- script// 定义请求参数const params {action: list_order};fetch(/api/mgr/orders/,{method: POST,headers: {Content-Type: application/json},body: JSON.stringify(params)})//获取请求的结果数据json.then(response response.json()).then(data {// 打印返回的 JSON 数据console.log(data);// 解析JSON数据并提取retlist的值const retlistValues data.retlist; // retlist的值是一个包含多个JSON对象的数组console.log(retlistValues)//获取页面div一会把自定义的div加进去const existingDiv document.getElementById(list-container)// 遍历retlist的值并将字段显示在页面上retlistValues.forEach(obj {// 在页面上创建新的元素来显示字段和值const div document.createElement(div);for (let key in obj) {const span document.createElement(span);span.innerText ${key}: ${obj[key]};div.appendChild(span);}existingDiv.appendChild(div)});})/script /body /html
http://www.pierceye.com/news/581920/

相关文章:

  • 兰州微信信息平台网站建设绍兴本地网站建设
  • 关于旅游网站策划书千锋前端培训多少钱
  • 温州网站建设结构做代练网站能备案
  • 零基础学习做网站第三方装修评估公司
  • 基础微网站开发动态网站彩票投注员做啥的
  • 西安做网站设计公司爱做网站免费版
  • 效果图网站接单重庆一般建一个网站需要多少钱
  • 网站建设征求意见稿辅料企业网站建设费用
  • 上海网站建设公司服务沅江网站制作
  • 公司网站开发费用计入什么科目虚拟主机怎么建网站
  • 天津网站建设技术网页设计与制作教程版徐洪亮课后答案
  • 旅游网站建设方案简介用asp做的网站打开页面很慢
  • 做影视网站 片源从哪里来做自媒体的上那些网站
  • 邢台网站开发百度云 做网站
  • 淘宝优惠劵网站建设wordpress主题 简洁
  • 自己做电影资源网站揭阳新闻最新消息
  • 北碚免费建站哪家做得好佛山网站建设设计
  • 怎么做网站拍卖的那种wordpress主题搜索图标
  • 三亚网站建设平台查数据的权威网站
  • html网站制作答辩ppt网站备份和备案的区别
  • 网站开发需要工具免费的ps软件
  • 常州网站建设优质商家重庆互联网怎么样
  • 做网站发广告动漫网页设计报告
  • 求职招聘网站建设投标书沈阳网站建设的公司哪家好
  • 做导航网站有发展吗南京企业网站制作哪家好
  • 千万pv网站开发成本招聘网站数建设
  • 吐鲁番大型网站建设平台找客户去哪个平台
  • 权威网站有哪些给个网站可以在线
  • 优化网站专题北京海淀网站建设公司
  • 广州网站快速排名网站维护正常要多久