这篇文章用于记录Django模型相关知识,发现有需要补充的会随时添加
仅用于记录,以后方便自己查阅,至于大家能不能看懂,我觉得随缘就行。
1、自定义模型管理器
一般情况下,我们定义的模型类如下
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(null=False)
isDelete = models.BooleanField(default=False)
这时候我们如果要查询,应该如何?
BookInfo.objects.all()
这样没错吧?
查询出BookInfo表中所有数据,以列表形式返回。
起始objects,就是调用ORM的核心——管理器,然后去数据库查询的。
我们可以自定义管理器,就像下面这样:
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(null=False)
isDelete = models.BooleanField(default=False)
# 自定义管理器
book1 = models.Manager()
这样我们查询就可以写成这样
BookInfo.book1.all()
# 注意如果自定义了管理器就不能用默认的管理器了
# 也就是说不能够使用
# BookInfo.objects.all()
# 也包括
# BookInfo.objects.get(xxx)
相当于book1就代替了objects的位置。
当然我们如果功能仅限于此,那我们也没有自定义管理器的必要了
我们就是为了更改默认查询,就像下面这样:
# 自定义管理器类
class BookInfoManager(models.Manager):
# 重写默认查询方法
def get_queryset(self):
return super(BookInfoManager, self)
.get_queryset().filter(isDelete=False)
# 模型类
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(null=False)
isDelete = models.BooleanField(default=False)
# 新建对应模型的自定义管理器对象
book = BookInfoManager()
# 新建默认模型管理类对象
bookdefault = models.Manager()
# 一般自定义管理器对象建立后也有一个默认的,来弥补自定义管理器对象的短板
使用的时候就可以自动过滤掉那些已经被逻辑删除的那些内容。
这才是使用模型管理类的正确姿势。
2、模型类对象的正确创建方法
如果模型类是:
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(null=False)
isDelete = models.BooleanField(default=False)
我们在创建的时候该这么做:
b = BookInfo()
b.btitle = 'abc'
b.bpub_date = datetime(1991,1,1)
b.bread = 0
b.bcomment = 0
b.isDelete = False
b.save()
我们创建对象的时候后三个一直都是一样的,那我们每次都写,累不累?
于是我们想利用init方法来新建对象。发现models.Model中已经有了而且做了大量的工作,我们也不知道参数是什么,所以最好用init方法。
(1)那我们直接在类中定义类方法吧。
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(null=False)
isDelete = models.BooleanField(default=False)
@classmothed
def create(cls,title,pub):
b = BookInfo()
b.btitle = title
b.bpub_date = pub
b.bread = 0
b.bcomment = 0
b.isDelete = False
return b
调用:
b = BookInfo.create('abc',datetime(1991,1,1))
(2)之前说过模型类管理器,既然是管理器,就可以去管理模型类的创建
# 自定义管理器类
class BookInfoManager(models.Manager):
# 重写默认查询方法
def get_queryset(self):
return super(BookInfoManager, self)
.get_queryset().filter(isDelete=False)
# 创建
def create(self,title,pub):
b = BookInfo()
b.btitle = title
b.bpub_date = pub
b.bread = 0
b.bcomment = 0
b.isDelete = False
return b
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(null=False)
isDelete = models.BooleanField(default=False)
book = BookInfoManager()
创建过程:
b = BookInfo.book.create('123',datetime(1991,1,1))
这样以来可以省去不少麻烦。