Python學習筆記——pycharm web伺服器搭建(6):Django模型知識點
阿新 • • 發佈:2019-01-26
這篇文章用於記錄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))
這樣以來可以省去不少麻煩。