模型类-管理器
作用: 用于与数据库交互
每个模型类默认有一个管理器,objects
objects是Django自动生成的管理器,可以实现对数据的查询,objects是models.Manger类的一个对象。
为满足特殊条件,可以自定义管理器
1、修改管理器的原始查询集(重写get_queryset()方法)
class BookInfoManager(models.Manager):
def get_queryset(self):
return super(BookInfoManager,self).get_queryset().filter(isDelete=False)
自定义管理器之后Django不再生成默认的objects管理器
2、模型类对象的创建方法
BookInfo模型类
from django.db import models
class BookInfo(models.Model):
btitle=models.CharField(max_length=20)
bpub_date=models.DateTimeField(db_column='pub_date')
bread=models.IntegerField(default=0)
bcomment=models.IntegerField(default=0)
isDelete=models.BooleanField(default=False)
class Meta:
db_table='bookinfo'
# 管理器的对象作为模型类的一个属性
books1=models.Manager()
books2=BookInfoManager()
模型类中__init__
方法不可用
解决方法:
①在模型类中定义一个类方法
@classmethod
def creat(cls,btitle,bpub_date):
b=BookInfo()
b.btitle=title
b.bpub_date=pub_date
b.bread=0
b.bcomment=0
b.isDelete=False
return b
②在自定义的管理器中定义方法(推荐)
class BookInfoManager(models.Manager):
def create(self,btitle,bpub_date):
b=BookInfo()
b.btitle=title
b.bpub_date=pub_date
b.bread=0
b.bcomment=0
b.isDelete=False
return b
调用语法
book=BookInfo.books2.create("abc",date(1980,1,1))
查询
属性__比较符(谓词)=值
btitle__contains='八'
聚合
- Max,Min,Avg
from django.db.modlels import Max
list = BookInfo.books1.aggregate(Max('bpub_date'))
- count
count = list.count()
F对象
比较两个字段(普通查询为字段和常量比较)
from django.db.modlels import Max,F
list = BookInfo.books1.filter(bread__gt=F('bcomment'))
Q对象
过滤器的参数为逻辑与(&)的关系
若需实现逻辑或(|),使用Q对象
from django.db.models import Q
list = BookInfo.books1.filter(Q(pk__lt(4)|Q(btittle__contains='1'))