目录

  • Django中Manager用法
  • 在管理器类中定义创建对象的方法
  • 增加额外的方法
  • 重写get_queryset()方法

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('张三')

重写get_queryset()方法

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()了,你可能接受到一个无用的返回对像,你必须避免这种情况.