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)

大家都在看

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