1. 程式人生 > >Python學習筆記——pycharm web伺服器搭建(6):Django模型知識點

Python學習筆記——pycharm web伺服器搭建(6):Django模型知識點

這篇文章用於記錄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))

這樣以來可以省去不少麻煩。