1. 模型类管理器的概念
在Django中,模型类是处理数据库表的核心,一个Django模型类对应一张数据库表。模型类管理器是模型类的一部分,用于封装数据库操作。模型类管理器可以让我们更方便地进行数据的操作,比如筛选、排序、限制结果等等。
2. 默认管理器objects的使用
在Django中,每个模型类都隐含一个默认的管理器objects。默认管理器会为我们提供一些常用的数据库操作方法,使我们可以通过模型类进行操纵数据库,而不需要直接操作数据库。
2.1 查询所有记录
我们可以使用all()方法查询模型类对应的数据库表中的所有记录。
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
Person.objects.all()
使用all()方法可以返回模型类对应的表中的所有记录。
2.2 查询指定记录
我们可以使用get()方法查询模型类对应的数据库表中满足条件的单条记录。如果找不到符合条件的记录,此方法将抛出数据库异常。
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
Person.objects.get(name='Tom')
使用get()方法可以返回模型类对应的表中符合条件的单条记录。
2.3 对记录进行排序
我们可以使用order_by()方法对查询结果进行排序,可以通过传入一个或多个属性名来指定按照哪些属性排序。
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
Person.objects.order_by('age')
使用order_by()方法可以返回按照指定属性排序的模型类对应的表中的所有记录。
3. 自定义模型类管理器
我们也可以自定义模型类管理器,以提供更多的查询接口。自定义管理器并不会覆盖默认管理器,而是增加到模型类中。
3.1 创建自定义管理器
创建自定义管理器需要在模型类中定义一个继承自models.Manager的类,然后将该类赋值给一个模型类属性。
class UserManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_deleted=False)
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
is_deleted = models.BooleanField(default=False)
objects = models.Manager() # The default manager.
users = UserManager() # The custom manager.
在这个例子中,我们创建了一个自定义管理器UserManager,并通过模型类属性users将其赋值给Person模型类。自定义管理器的get_queryset()方法将默认查询结果进一步过滤,只返回is_deleted为False的查询结果。
3.2 使用自定义管理器
我们定义完自定义管理器后,即可通过自定义管理器进行查询操作。可以通过以下方法获取指定管理器的Queryset:
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
is_deleted = models.BooleanField(default=False)
objects = models.Manager() # The default manager.
users = UserManager() # The custom manager.
Person.users.all()
使用自定义管理器可以更加方便地进行筛选,实现逻辑更易读懂,代码更易维护。
4. 管理器的链式调用
多个管理器可以进行链式调用,以实现更复杂的查询操作。
class UserManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_deleted=False)
class ActiveUserManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_active=True)
class Person(models.Model):
name = models.CharField(max_length=30)
age = models.IntegerField()
is_deleted = models.BooleanField(default=False)
is_active = models.BooleanField(default=False)
objects = models.Manager() # The default manager.
users = UserManager() # The custom manager.
active_users = ActiveUserManager() # The custom manager.
Person.active_users.users.all()
在这个例子中,我们使用两个自定义管理器进行链式调用。调用active_users可以获得is_active为True的用户,而调用users则进一步筛选出is_deleted为False的用户。
总结
模型类管理器是Django中的核心概念,它为我们提供了简便的封装。默认管理器提供了基础的数据库操作,而自定义管理器可以让我们实现更加灵活的查询,Chainable Managers可以灵活使用我们定义好的自定义管理器进行多种操作。使用模型类管理器需要仔细设计和实现,合理组织管理器之间的联系可以为我们提供更加高效和健壮的程序。