Django中自定义管理器Manager用法

Django中Manager用法

第一种
class create_user(models.Manager):
    def create(self, name, sex, age):
        u = self.model()  # 创建模型类对象self.model可以获得模型类
        u.name = name
        u.sex = sex
        u.age = age
        u.save()
        return u
第二种
def create_u(self, name, sex, age):
    # 在创建之前的一些通用逻辑
    ...

        u = super().create(name=name,sex=sex,age=age)
    ...
    # 在创建之后的一些通用逻辑
        return u
自定义manager必须继承自models.Manager
class User_manager(models.Manager):
    def get_user(self,name):
        return self.filter(name=name) # 自己没定义filter会去父类找filter
class User(models.Model):
    name = models.CharField(max_length=100)
    information = models.CharField(max_length=100)
    objects = models.Manager()    # 如果想要使用默认的管理器objects,则要声明出来才可以使用
    diy = User_manager()         # 自定义的管理器

原来的查询方法可以继续使用
user = User.objects.all()
在这里我们增加了一个自定义的查询方法get_user
user = User.diy.get_user('张三')

manager的基础Queryset返回系统中的所有对象.例如, Book.objects.all()返回book数据库中的所有书籍.你而已通过覆盖 Manager.get_queryset()方法来重写manager的基础Queryset. get_queryset()应该按照你的需求返回一个Queryset.

例如,下面的模型有两个manger–一个返回所有对象,另一个仅返回作者是Roald Dahl的书

get_queryset()其表现形式可以看成是 .all() 使用.all()就会触发get_queryset()方法

from django.db import models

#首先,定义一个Manager的子类
class DahlBookManager(models.Manager):
    def get_queryset(self):
        return super(DahlBookManager, self).get_queryset().filter(author='Roald Dahl')
  或者  return super().get_queryset().filter(author='Roald Dahl')

然后,将它显式地插入到Book模型中
class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)
    ...

    objects = models.Manager()    # 默认Manager
    dahl_objects = DahlBookManager()    # 自定义的特殊Manager

使用
Book.dahl_objects.all() 默认就是查条件为author='Roald Dahl'筛选之后的数据了

在这个示例模型中, Book.objects.all()将返回数据库中的所有书籍,而 Book.dahl_objects.all()只返回作者是Roald Dahl的书籍.注意我们明确的将 objects设置为默认 Manger的一个实例,因为如果我们不这样做,那么dahl_objects将成为唯一一个可用的manager.

由于 get_queryset()返回一个Queryset对象,所以你可以使用 filter(), exclude()和其他所有的Queryset方法.

如果你使用自定义的Manager对象,请注意,Django遇到的第一个Manager(以它在模型中被定义的位置为准)会有一个特殊状态。 Django将会把第一个Manager 定义为默认Manager ,Django的许多部分(但是不包括admin应用)将会明确地为模型使用这个manager。 结论是,你应该小心地选择你的默认manager。因为覆盖 get_queryset()了,你可能接受到一个无用的返回对像,你必须避免这种情况.

Original: https://www.cnblogs.com/zonghan/p/16571500.html
Author: zong涵
Title: Django中自定义管理器Manager用法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/611340/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • redis中key和value的存储大小限制

    String类型:一个String类型的value最大可以存储512M List类型:list的元素个数最多为2^32-1个,也就是4294967295个。 Set类型:元素个数最…

    Linux 2023年5月28日
    0135
  • 高等代数(上)丘维声 笔记

    1 线性方程组的解法 1、线性方程组:左端为未知量x的一次齐次式,右端是常数。关键词:系数、常数项、n元线性方程组、解集 2、线性方程组的初等变换:1)把一个方程的倍数加到另一个方…

    Linux 2023年6月8日
    0110
  • Linux快速安装流量监控工具(实用版)

    前言: Linux流量监控工具,在此我推荐两种分别为: 1、nload(推荐)因为个人看着舒服点😂 2、iftop 你可以选择上面两种中的任何一种。下面是这两个版本的简介和安装教程…

    Linux 2023年5月27日
    095
  • 函数指针的重要用途——回调函数

    什么是回调函数? 粗暴的说,如果一个函数作为另一个函数的参数传入,这种函数就可以称为回调函数(这句话并不严谨,但为了说明问题可以这么理解)。C语言里面,一般就是一个函数的参数列表中…

    Linux 2023年6月8日
    097
  • pysimpleGui FilesBrowse函数原始说明

    FilesBrowse: (button_text=’Browse’, target=(ThisRow, -1), file_types=((“…

    Linux 2023年6月14日
    070
  • SQL52 获取employees中的first_name

    本题链接表结构如下所示(内容不完整):额外的要求是按照first_name最后两个字母升序进行输出。这里需要用到MySQL的字符串处理函数RIGHT。RIGHT函数的语法如下所示:…

    Linux 2023年6月13日
    0122
  • MySQL之视图、触发器、事务、索引及其他知识补充

    一、视图 视图是将SQL语句的查询结果当做虚拟表实体化保存起来,以后可以反复使用 create view teacher2course as select * from teach…

    Linux 2023年6月14日
    096
  • Identity Server 4使用OpenID Connect添加用户身份验证(三)

    一、说明 基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4资源拥有者密码认证控制访问API…

    Linux 2023年6月13日
    083
  • redis五种数据类型及使用场景

    一、Redis简介Redis 是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库。它可以用作数据库、缓存和消息中间件。它支持的数据类…

    Linux 2023年5月28日
    089
  • linux free命令available小于free值

    问题:前段时间在做服务器巡检时发现系统可用内存值小于空闲内存值 分析:查询网上各种资料,都说的是 available=free + buff/cache 这样一个大致计算方式,按这…

    Linux 2023年6月14日
    0172
  • shell中的##*,%%*问题

    假设我们定义了一个变量为:file=/dir1/dir2/dir3/my.file.txt 可以用${ }分别替换得到不同的值:${file#/}:删掉第一个 / 及其左边的字符串…

    Linux 2023年5月28日
    071
  • Redis-实现SpringBoot集成Redis多数据源

    背景​ 有些时候在一个项目里,由于业务问题,可能仅仅操作一个Redis数据源已经不能满足,比如某个运营系统,对接着多个不同的服务,处理数据时又不想通过远程调用,那只能增加一个数据源…

    Linux 2023年5月28日
    082
  • Linux安装管理

    Linux系列 包管理工具 单个软件包 管理工具 RedHat系列 Redhat Centos Fedora yum rpm .rpm Debian系列 Ubuntu apt-ge…

    Linux 2023年6月8日
    098
  • 实现批量自动部署Linux操作系统

    实战描述: xxx公司所服务的用户IT环境中有很多的Linux系统,品种也五花八门,有RHEL、Centos、OpenSUSE甚至还有测试环境使用的RockyLinux。当有大量的…

    Linux 2023年6月7日
    0104
  • 位运算(一)

    位运算的一般应用 功能 例子 运算 去掉最后一位 1110101->111010 x>>1 在最后加0 1110101->11101010 x< 通过…

    Linux 2023年6月8日
    0140
  • [20220228]enq TX

    [20220228]enq TX – allocate ITL entry的测试3.txt –//上个星期的测试有点乱,重新规划测试. 1.环境:SCOTT…

    Linux 2023年6月13日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球