Python Web开发技巧VIII

news2024/11/16 9:33:07

目录

ModelSerializer和Serializer区别是什么

从queryset中取出某个models的字段值

Q对象进行模糊匹配

HTTP方式-如何模糊搜索JSON字段中的某个KEY值呢?

showmigrations

合并两个或多个queryset


ModelSerializer和Serializer区别是什么

        都是DRF中用于序列化和反序列化数据的组件。主要区别在于:ModelSerializer是针对Django模型(models)的快捷方式,它自动根据模型生成相应的序列化器字段和验证器。而Serializer则是一个通用的序列化器,需要手动定义字段和验证器。

  1. ModelSerializer
    • 针对Django模型的快捷方式。
    • 自动生成序列化器字段,根据模型中的字段类型选择相应的序列化器字段类型。
    • 自动生成验证器,根据模型中的字段约束(如uniquemax_length等)创建相应的验证器。
    • 自动生成create()update()方法,用于创建和更新模型实例。
    • 需要定义一个Meta类,指定模型类和序列化器字段。
  2. Serializer
    • 通用的序列化器,适用于任何类型的数据。
    • 需要手动定义序列化器字段和验证器。
    • 需要手动实现create()update()方法(如果需要的话)。
    • 不需要定义Meta类。

大多数情况下,如果处理的数据与Django模型相关,那么ModelSerializer会更方便,它可以自动处理很多事情,减少了手动编写代码的工作。如果处理的数据与Django模型无关,或需要自定义序列化和验证逻辑,那么使用通用的Serializer可能更合适。

【注:serializers.Serializer 类不会自动使用 Meta 类。】

从queryset中取出某个models的字段值

from myapp.models import MyModel

# 获取MyModel的QuerySet
queryset = MyModel.objects.all()
# 从QuerySet中获取某个字段(例如'field1')的值
field_values = queryset.values_list('field1', flat=True)
# 保证单个元素获取
field_value = queryset.values_list('field1', flat=True).first

flat=True表示返回一个单个值的列表,而不是元组

# 使用flat=True
result = queryset.values_list('field_name', flat=True)
# 返回结果类似:[value1, value2, value3, ...]

# 不使用flat=True
result = queryset.values_list('field_name')
# 返回结果类似:[(value1,), (value2,), (value3,), ...]

 而次数subject.values_list("follow_up_count", flat=True).first则直接为0。

Q对象进行模糊匹配

如 icontainsiexactstartswith 等

from django.db.models import Q
from myapp.models import MyModel

# 获取 name 包含 'John' 或 'Jane' 的对象(不区分大小写)
result = MyModel.objects.filter(Q(name__icontains='John') | Q(name__icontains='Jane'))

# 获取 name 以 'J' 开头的对象(不区分大小写)
result = MyModel.objects.filter(Q(name__istartswith='J'))

# 获取 name 等于 'John' 或 'Jane' 的对象(不区分大小写)
result = MyModel.objects.filter(Q(name__iexact='John') | Q(name__iexact='Jane'))

        往往我们使用Q对象时,对应的搜索框可以使用不止一个字段的检索,这时如何提供查询效率和简便代码呢?
        我们一般采取先创建Q对象,如何按OR的方式塞入,再往里面创建不同的Q对象添加,最后一次filter执行,一般为优化代码,还同时把函数嵌套在函数里,例如一下这种写法:

def create_q_object(field_name, search_terms):
    q_object = Q()
    q_object.connector = "OR"
    for term in search_terms.split(","):
        q_object.children.append((f"{field_name}__icontains", term))
    return q_object

query_set = self.get_queryset().filter(enabled=True)
con = Q()

if "name" in validated_data:
    con.add(create_q_object("name", validated_data["name"]), "AND")

if "age" in validated_data:
    con.add(create_q_object("age", validated_data["age"]), "AND")

query_set = query_set.filter(con)

注:

icontains:不区分大小写的子字符串搜索

contains: 区分大小写的子字符串搜索

HTTP方式-如何模糊搜索JSON字段中的某个KEY值呢?

假设场景:

        数据库中存储字段user值为{name: hh, age: 18},在搜索栏中使用name=h,name通过序列化

        器,请问如何用Q对象对其进行模糊搜索,把对应匹配的字段数据返回。

核心代码:

# 注:JSONField不支持__icontains查询,根据场景这里的user字段是JSONField
users = User.objects.filter(Q(user__contains={'name': name}))

showmigrations

python manager.py showmigrations会根据迁移的记录展示是否迁移(与django_migrations表相关联)

合并两个或多个queryset

用union

queryset = queryset1.union(queryset2)

另外exists()属性可直接判断一个Queryset是否为空

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/807815.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚医通9:医院列表功能+GateWay网关

内容介绍 1、医院列表功能(接口) 4、医院列表功能(前端) 5、更新医院上线状态功能 6、医院详情 7、GateWay网关 8、医院排班管理需求分析 9、查看医院所有科室接口、前端 医院列表功能(接口) 接口…

代码随想录算法训练营day15 | 102. 二叉树的层序遍历,226. 翻转二叉树,101. 对称二叉树

目录 102. 二叉树的层序遍历 226. 翻转二叉树 101. 对称二叉树 100. 相同的树 100是101的衍生题目。572也为101的衍生题目。 102. 二叉树的层序遍历 思路&#xff1a; 以前的笔记 代码&#xff1a; class Solution {public List<List<Integer>> levelOrder(T…

web自动化测试-PageObject 设计模式

为 UI 页面写测试用例时&#xff08;比如 web 页面&#xff0c;移动端页面&#xff09;&#xff0c;测试用例会存在大量元素和操作细节。当 UI 变化时&#xff0c;测试用例也要跟着变化&#xff0c; PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时&#xff08;包…

Reinforcement Learning with Code 【Chapter 9. Policy Gradient Methods】

Reinforcement Learning with Code This note records how the author begin to learn RL. Both theoretical understanding and code practice are presented. Many material are referenced such as ZhaoShiyu’s Mathematical Foundation of Reinforcement Learning, . 文章…

C++之实例化对象总结(一百七十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

13 亿美金买个寂寞?No!AI 时代的数据行业蓄势待发

6月底&#xff0c;全球数据分析领域彻底炸锅了。 两大数据分析企业Databricks和Snowflake纷纷将目光瞄准了AI大模型。要知道&#xff0c;这两位对手平时没少对台戏&#xff0c;为性能、产品和技术经常开撕。但在今年的自家大会上&#xff0c;两家企业却出奇的一致&#xff0c;…

opencv+ffmpeg环境(ubuntu)搭建全面详解

一.先讲讲opencv和ffmpeg之间的关系 1.1它们之间的联系 我们知道opencv主要是用来做图像处理的&#xff0c;但也包含视频解码的功能&#xff0c;而在视频解码部分的功能opencv是使用了ffmpeg。所以它们都是可以处理图像和视频的编解码&#xff0c;我个人感觉两个的侧重点不一…

【博客684】Multi-regional高可用模式部署VictoriaMetrics

Multi-regional模式部署VictoriaMetrics 整体架构图 每个工作负载区域&#xff08;地球、火星、金星&#xff09;都有一个 vmagent&#xff0c;通过监控设置将数据发送到多个区域。监控设置&#xff08;地面控制 1,2&#xff09;包含 VictoriaMetrics 时间序列数据库 (TSDB) 集…

四姑娘山三日游

趁着小孩放暑假&#xff0c;从昆明回来之后&#xff0c;直接自驾到四姑娘山。 第一天 成都-四川省阿坝藏族羌族自治州小金县日隆镇(20230711) 大概9:30从成都市郫都区出发&#xff0c;路线如下&#xff1a;郫都—都江堰–映秀—耿达—卧龙—四姑娘山&#xff0c;中途翻过巴朗…

Notepad++工具通过正则表达式批量替换内容

1.每行末尾新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入$&#xff0c;替换为输入特定字符串&#xff1b;选中循环查找&#xff0c;查找模式选正则表达式&#xff1b;最后点击全部替换 2.每行行首新增特定字符串 CtrlH弹出小窗口&#xff1b;查找目标输入^&…

会议OA之我的会议(会议排座送审)

目录 前言&#xff1a; 2.我的会议&#xff1a; 2.1实现的特色功能&#xff1a; 2.2思路&#xff1a; 2.3功能实现&#xff1a; 我的会议页面&#xff1a;myMeeting.jsp myMeeting.js Dao方法 在mvc中配置info信息 Meeting InfoAction 2.4会议排座的思路&#xff1a; …

第四代SHARC® ADSP-21479KBCZ-2A、ADSP-21479BSWZ-2A、ADSP-21479KSWZ-2A高性能DSP(数字信号处理器)

第四代SHARC Processors 现在内置低功耗浮点DSP产品&#xff08;ADSP-21478和ADSP-21479&#xff09;&#xff0c;可提供改进的性能、基于硬件的滤波器加速器、面向音频与应用的外设以及能够支持单芯片解决方案的新型存储器配置。所有器件都彼此引脚兼容&#xff0c;而且与以往…

【Android知识笔记】UI体系(二)

什么是UI线程? 常说的UI线程到底是哪个线程?UI线程一定是主线程吗? 下面先给出两条确定的结论: UI线程就是刷新UI所在的线程UI是单线程刷新的关于第二条为什么UI只能是单线程刷新的呢?道理很简单,因为多线程访问的话需要加锁,太卡,所以一般系统的UI框架都是采用单线程…

《重构的时机和方法》,值得程序员仔细研读的一本书

现有代码结构及框架沿用的比较久&#xff0c;持续在其上新增功能&#xff0c;可维护性与可扩展性变得越来越差&#xff0c;随着需求不断增加&#xff0c;现有代码变得越来越臃肿复杂&#xff0c;变得很难维护&#xff0c;甚至出现较严重的性能瓶颈&#xff0c;一般这个时候我们…

Thymeleaf入门

Thymeleaf是前端开发模板&#xff0c;springboot默认支持。前端模板用法大多数是类似的jsp、thymeleaf、vue.js都有while\for\if\switch等使用&#xff0c;页面组件化等。 1.前端模板区别 jsp是前后端完全不分离的&#xff0c;jsp页面写一堆Java逻辑。 thymeleaf好处是html改…

域名解析优先级

浏览器访问过程解析 访问网址——>首先在本地电脑看看hosts里面是否有域名对应IP地址&#xff0c;如何有直接访问对应IP&#xff0c; 如果没有&#xff0c;则联网询问DNS服务器&#xff08;一般网卡那边都配置了DNS服务器IP&#xff09; linux hosts 路径&#xff1a; w…

苍穹外卖-day07

苍穹外卖-day07 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…

中国气象局:到2030年,人工智能在气象应用领域取得世界领先地位

最近&#xff0c;中国气象局发布了《2023-2030年人工智能气象应用工作方案》&#xff0c;旨在加快推进国内人工智能气象应用技术体系建设&#xff0c;提升基础支撑能力&#xff0c;构建健全的人工智能气象应用政策环境&#xff0c;促进人工智能技术在气象观测、预报和服务领域的…

华为H12-821更新了32题,大家注意了

&#xff08;多选题&#xff09;使用堆叠和集群技术构建园区网的优势包括以下哪些项&#xff1f; A、业务中断时间大大减少 B、简化网络管理&#xff0c;降低网络部署规划的复杂度 C、可有效减少网络功耗 D、提高网络设备和链路的利用率 正确答案是…

教雅川学缠论02-K线

传统行情上的K线是下图中这样子的 而在缠论中K线是下面这样子的&#xff0c;它没有上影线和下影线 下图是武汉控股2023年7月的日K线 接下来我们将它转换成缠论K线&#xff08;画图累死我了&#xff09; K线理解了我们才能进行下一步&#xff0c;目前位置应该很好理解的