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)

大家都在看

  • Markdown基础语法

    Markdown语法 ## 欢迎使用Markdown编辑器 你好! 这是你第一次使用 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下M…

    Linux 2023年6月14日
    0107
  • 高速USB转4串口产品设计-RS485串口

    基于480Mbps 高速USB转8路串口芯片CH344Q,可以为各类主机扩展出4个独立的串口。CH344芯片支持使用操作系统内置的CDC串口驱动,也支持使用厂商提供的VCP串口驱动…

    Linux 2023年6月7日
    0110
  • 快速部署LAMP黄金架构,搭建disuz论坛

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    062
  • shell bash-shell

    bash shell中的命令替换,cmd或者$(cmd)。 bash shell中的变量赋值,直接name = var; ( bash中的变量赋值不能中间有空格) 变量引用时,$n…

    Linux 2023年5月28日
    099
  • 面试连环炮系列(二十️五):RocketMQ怎么保证消息不丢失

    A. 从Producer的视角来看:如果消息未能正确的存储在MQ中,或者消费者未能正确的消费到这条消息,都是消息丢失。 B. 从Broker的视角来看:如果消息已经存在Broker…

    Linux 2023年6月6日
    0145
  • MIT6.828——Lab3 PartA(麻省理工操作系统实验)

    Lab3 Part A MIT6.828——Lab1 PartA MIT6.828——Lab1 PartB Lab2内存管理准备知识 MIT6.828——Lab2 内核维护有关用户…

    Linux 2023年5月27日
    0109
  • .NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

    什么是.NET?什么是.NET Framework? 本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NE…

    Linux 2023年6月13日
    089
  • Python中str()和repr()的区别

    其实用处就是最大的区别了:str()主要用来为终端用户输出一些信息,而repr()主要用来调试;同时后者的目标是为了消除一些歧义(例如浮点数的精度问题),前者主要为了可读。 In …

    Linux 2023年6月8日
    0116
  • springboot mybatis层整合

    1、导入Mybatis包 使用maven 2、配置数据库连接 注意:classpath后不需要加 / 3、测试 4、建立实体类,可使用Lombok来简化 5、 创建mapper目录…

    Linux 2023年6月14日
    091
  • redis 入门安装流程

    redis安装流程 安装linux的Redis [官网下载即可][ https://redis.io/download/ ] 一般会移动到opt目录下 mv redis-7.0.4…

    Linux 2023年6月7日
    0104
  • Linux命令篇-curl 命令

    curl 查看网页源码 自动跳转 显示头信息 通信过程 下载文件 断点续传 获取天气 curl 查看网页源码 直接在curl命令后加上网址,就可以看到网页源码。 $ curl ww…

    Linux 2023年6月13日
    0110
  • Jenkins

    Jenkins Jenkins jenkins简介 jenkins工作原理 jenkins特点 CI/CD是什么 使用tomcat容器安装jenkins jenkins流水线项目发…

    Linux 2023年6月6日
    0119
  • NoteOfMySQL-14-日志管理

    一、MySQL日志 日志是MySQL数据库的重要组成部分,日志文件记录了MySQL数据库的日常操作和错误信息,可以通过分析这些日志文件了解MySQL数据库的运行情况。MySQL数据…

    Linux 2023年6月14日
    090
  • 华为IPv6 GRE隧道

    IPv6 over IPv4 GRE封装隧道 实验目标: 该实验参考了华为官网案例配置https://support.huawei.com/enterprise/zh/doc/ED…

    Linux 2023年6月7日
    089
  • SpringBoot 2.x 开发案例之 Shiro 整合 Redis

    前言 前段时间做了一个图床的小项目,安全框架使用的是 Shiro。为了使用户 7×24小时访问,决定把项目由单机升级为集群部署架构。但是安全框架 shiro只有单机存储的 Sess…

    Linux 2023年5月28日
    0111
  • 【填空题】考研数据结构填空题整理

    数据结构填空题 题源来自《算法与数据结构考研试题精析》、《王道数据结构》在Liang’s Blog所著的文章上补充考点,仅供参考学习 一、概论 数据元素 是数据的基本单…

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