原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

Django数据操作-ORM

第一章 【Django开发入门】ORM的增删改查和批量操作
第二章 【Django开发入门】ORM查询分页以及返回Json格式


文章目录

  • Django数据操作-ORM
  • 前言
  • 一、手敲转json
    • 1.在models中自定义方法
    • 2.循环写入list列表
  • 二、django的方式
    • 1.单条数据
    • 2.数据分页
  • 三、DRF的方式
    • 1.单条数据
    • 2.数据分页
  • 总结

前言

我们都知道Django框架默认是通过ORM来实现数据的增删改查,涉及到的orm方法为create、delete、update、get、filter、all、get_or_create、update_or_create。在Django中还有批量操作,如批量创建和批量更新,涉及到的方法为bulk_create、bulk_update。
日常开发过程中,都是以json格式来进行前后端数据传输。


一、手敲转json

1.在models中自定义方法

models.py文件

class Users():***class Meta:verbose_name = u'用户'verbose_name_plural = verbose_namedef get_dict(self):one_dict = {'username':self.username,'email':self.email,****}  return one_dict

views.py文件

from .models import Usersdef get_one_project(request):position = Project_position.objects.get(id=id)return HttpResponse(json.dumps(position.get_dict()), content_type="application/json")

2.循环写入list列表

def get_all(request):projectposition_list= Project_position.objects.all()positionlist = []for item in projectposition_list:# print(item.level)content = {}content['岗位编号'] = item.idcontent['岗位名称'] = item.project_positioncontent['定编人数'] = item.numberofpeoplecontent['实际人数'] = item.realitypeople()content['使用状态'] = item.get_state_display()content['岗位基本描述'] = item.describepositionlist.append(content)res = {}res['status'] = 'success'res['data'] = positionlistreturn JsonResponse(res)

二、django的方式

1.单条数据

from django.forms.models import model_to_dictdef get_one_project(request):position = Project_position.objects.get(id=id)result= model_to_dict(position)return HttpResponse(json.dumps(result), content_type="application/json")

2.数据分页

def get_users(request):users = UserProfile.objects.all()result = serializers.serialize("json", users)return HttpResponse(result)

下面这样也是可以的

import jsondef get_users(request):data = json.dumps(list(UserProfile.objects.all().values()))return HttpResponse(data)

三、DRF的方式

DRF是django前后端分离的三方库,具体使用可参考相关文档,DRF官方文档

DRF的使用需要配置相关参数,需要建立serializer.py文件。这里提供一份样例。

# -*- coding:utf-8 _*-
"""
@author:lenovo
@file: serializer.py
@time: 2022/11/4  9:50
"""
import refrom django.core.cache import cache
from django.core.validators import EmailValidator
from django.utils.translation import gettext as _
from django.contrib.auth.hashers import make_password
from rest_framework import serializers
from rest_framework.serializers import ModelSerializerfrom users.models import LoginUserclass RegisterSerializer(ModelSerializer):"""注册账户"""password = serializers.CharField(write_only=True)password2 = serializers.CharField(write_only=True)code = serializers.IntegerField(write_only=True)default_error_messages = {"username_error": _('用户名必须以字母开头,且包含3~15个字母、数字'),"username_registered_error": _('用户名已存在'),'password_error': _('两次输入密码不一致'),"phone_error": _('手机号格式有误,请重填'),"phone_registered_error": _('手机号已注册'),'code_error': _('验证码不正确'),"email_error": _('电子邮箱格式有误,请重填'),"email_registered_error": _('邮箱已注册'),}class Meta:model = LoginUserfields = ['username', 'phone', 'password', 'password2', 'code']def validate_username(self, username):"""单字段验证:名字"""# 1.用户名格式if not re.match(r'^[a-zA-z]\w{2,15}$', username):raise serializers.ValidationError(self.error_messages['username_error'])# 2.用户名是否存在if LoginUser.objects.filter(username=username).exists():raise serializers.ValidationError(self.error_messages['username_registered_error'])return usernamedef validate_phone(self, phone):"""单字段验证:手机号"""# 1.验证手机号码是否合法rs = r'^([+]?0?\d{2,3}-?|\([+]?0?\d{2,3}\)|\([+]?0?\d{2,3}\))?\d+$|^([+]?0?\d{2,3}-?|\([+]?0?\d{2,3}\)|\([+]?0?\d{2,3}\))?[1-9]\d{4,10}(-\d{1,10})?$'if not re.match(r'1[0-9]\d{9}$', str(phone)) and not re.match(rs, str(phone)):raise serializers.ValidationError(self.error_messages['phone_error'])# 2.手机是否注册if LoginUser.objects.filter(phone=str(phone)).exists():raise serializers.ValidationError(self.error_messages['phone_registered_error'])return phone# def validate_code(self, code):#     """单字段验证:验证码"""#     phone =#     if cache.has_key(phone):#         old_code = cache.get(phone)#         print(str(code))#         print(1111)#         print(str(old_code))#         if str(old_code) != str(code):#             raise serializers.ValidationError(self.error_messages['code_error'])def validate_email(self, email):"""单字段验证:邮箱"""# 1.邮箱格式rs = '^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'if not re.match(rs, email):raise serializers.ValidationError(self.error_messages['email_error'])# 2.邮箱是否存在if LoginUser.objects.filter(email=email).exists():raise serializers.ValidationError(self.error_messages['email_registered_error'])return emaildef validate(self, attrs):"""组合字段验证"""password = attrs.get('password')password2 = attrs.get('password2')if password and password2 and password != password2:raise serializers.ValidationError(self.error_messages['password_error'])attrs['password'] = make_password(attrs['password2'])  # 还可以通过重写create方法加密密码# 验证码phone = attrs.get('phone')code = attrs.get('code')print('123123')if cache.has_key(phone):old_code = cache.get(phone)print(str(code))print(1111)print(str(old_code))if str(old_code) != str(code):raise serializers.ValidationError(self.error_messages['code_error'])else:raise serializers.ValidationError(self.error_messages['code_error'])del attrs['password2']del attrs['code']return attrsclass UserSerializer(ModelSerializer):class Meta:model = LoginUserfields = ['username', 'phone', 'user_permissions']

以下是views文件

1.单条数据

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
from rest_framework.filters import OrderingFilter
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSetfrom target.models import Target
from target.serializer import TargetSerializer
from utils.jwt_auth import IsAuthentication
from utils.pagination import FSNumberPagination@method_decorator(csrf_exempt, name="dispatch")
class TargetView(ModelViewSet):"""list:获取存档订单全部记录retrieve:获取一条"""queryset = Target.objects.all()serializer_class = TargetSerializer# 筛选类型filter_backends = [OrderingFilter]# 指定可排序字段以及默认排序字段ordering_fields = ['id']ordering = ['-id']# 认证authentication_classes = [IsAuthentication]# 权限permission_classes = []# 配置分页器类pagination_class = FSNumberPaginationdef retrieve(self, request, *args, **kwargs):instance = self.get_object()serializer = self.get_serializer(instance)return Response({'code': 0,'msg': 'ok','data': serializer.data})

2.数据分页

from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from rest_framework import status
from rest_framework.filters import OrderingFilter
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSetfrom target.models import Target
from target.serializer import TargetSerializer
from utils.jwt_auth import IsAuthentication
from utils.pagination import FSNumberPagination@method_decorator(csrf_exempt, name="dispatch")
class TargetView(ModelViewSet):"""list:获取存档订单全部记录retrieve:获取一条"""queryset = Target.objects.all()serializer_class = TargetSerializer# 筛选类型filter_backends = [OrderingFilter]# 指定可排序字段以及默认排序字段ordering_fields = ['id']ordering = ['-id']# 认证authentication_classes = [IsAuthentication]# 权限permission_classes = []# 配置分页器类pagination_class = FSNumberPagination# 限流def list(self, request, *args, **kwargs):queryset = self.filter_queryset(self.get_queryset())page = self.paginate_queryset(queryset)if page is not None:serializer = self.get_serializer(page, many=True)return Response({'code': 0,'msg': 'ok','count': queryset.count(),'data': serializer.data})serializer = self.get_serializer(queryset, many=True)return Response({'code': 0,'msg': 'ok','count': queryset.count(),'data': serializer.data})

总结

本片只是针对数据的返回做了相关处理,涉及到json的具体内容需要根据实际场景使用。

【Django】如何将ORM查询转为Json相关推荐

  1. 067:【Django数据库】ORM查询条件详解-range

    [Django数据库]ORM查询条件详解-range range: 判断某个 field 的值是否在给定的区间中.示例代码如下: # views.py文件内容:from datetime import ...

  2. Django–模型层orm查询

    文章目录 Django–模型层orm查询 一.单表查询(增.删.改.查) 基本查询 下划线查询 二.外键字段(增.删.改.查) 一对多 多对多 三.多表查询 多表查询的方式 正反向的概念 基于对象的跨 ...

  3. Django笔记:ORM模型

    Django中操作数据库的方式有两种,一种是使用ORM模型,另一种是直接执行SQL,推荐使用ORM模型的方式来管理数据库,因为当需要执行的数据库操作过多时,第二种方式产生的SQL会非常难于管理和维护, ...

  4. Django ORM 查询重复记录并显示

    文章目录 Django ORM 查询重复记录并显示 废话不谈,两横一竖开始 开始正题 下午继续vue Django ORM 查询重复记录并显示 写了简单的项目信息录入系统,让同事便于录入. 同事要求 ...

  5. web.py中实现类似Django中的ORM的查询效果

    Django中的对象查询 Django框架自带了ORM,实现了一些比较强大而且方便的查询功能,这些功能和表无关.比如下面这个例子: class Question(models.Model):quest ...

  6. hive 如何将数组转成字符串_hive 将hive表数据查询出来转为json对象和json数组输出...

    1.将hive表数据查询出来转为json对象输出apache 一.将查询出来的数据转为一行一行,并指定分割符的数据json 二.使用UDF函数,将每一行数据做为string传入UDF函数中转换为jso ...

  7. Django中的ORM操作之高级查询aggregate和annotate方法

    Django中的ORM操作之高级查询aggregate和annotate方法 aggregate()方法详解 annotate()方法详解 aggregate和annotate应用场景 Django中 ...

  8. python django orm查询集总结

    1 .什么是ORM (Object Relational Mapping ) 它的作用是在关系型数据库和业务实体对象做一个映射,我们在操作具体业务对象的时候就可以省去了和SQL语句打交道,只需要简单的 ...

  9. Java获取数据库表的字段信息,及如何将ResultSet转为json

    为什么80%的码农都做不了架构师?>>>    一.Java获取数据库表的各个字段的相关信息 在某些开发情景中,需要获取数据库中表的各个字段的相关信息,如字段名,字段类型,字段大小等 ...

  10. 读取mysql数据库的数据,转为json格式

    # coding=utf-8 ''' Created on 2016-10-26 @author: Jennifer Project:读取mysql数据库的数据,转为json格式 ''' import ...

最新文章

  1. python多线程下的信号处理程序示例
  2. 数据预处理为什么使用独热编码one-hot
  3. SQL Injection(SQL注入)介绍及SQL Injection攻击检测工具
  4. Java IO流之文件流
  5. 虹康三期倒垃圾时间和理发地点
  6. emmet语法 1127
  7. bz2解压命令_tar 命令
  8. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈
  9. 计算机网络的发展英文,计算机网络英文方向论文选题 计算机网络英文论文题目哪个好...
  10. 链表讲解和基本操作练习附代码
  11. elasticdump安装_elasticsearch导入导出工具elasticdump安装和使用小记
  12. julia的几种画图方法
  13. 色斑图制作及后端无人值守自动出图kriging.js+chrome+html2canvas.js+DOS+BIGEMAP超低成本实现气象要素色斑图
  14. SecureCRT 7.3软件下载及破解工具+教程
  15. windows驱动开发技术详解 VC6与DDK搭配使用的设置
  16. 我的世界1.12.2java下载_我的世界1.12.2.2中文版下载 我的世界1.12.2.2中文版单机游戏下载...
  17. C6678/C6657+ZYNQ/K7/A7 FPGA+AD+北斗的软硬件设计方案
  18. 耗电优化(上):Android App 耗电分析
  19. 曼哈顿距离最小生成树莫队算法
  20. 苹果电脑上手写html,暴强:Mac电脑触控板也可用Apple Pencil手写笔

热门文章

  1. 数据结构——“线性表的应用举例“ 深度分析学完线性表工作中应用在哪?
  2. 这位哈佛学霸想让你的新年闪亮一点!
  3. apt权限错误(apt download/install permission error)
  4. SOA 背后的管理哲学
  5. 安卓开发者模式!一个三非渣本的Android校招秋招之路,高级面试题+解析
  6. 在安卓中使用SVG矢量图
  7. Linux、Android、uCOS、uCLinux、VxWorks、WinCE等系统比较
  8. 《申论》万能八条灵活运用
  9. 基于线性表的图书管理系统实验报告
  10. SEO技术文章-分析竞争对手的18个要点