1. 程式人生 > >(模型三)模型成員介紹

(模型三)模型成員介紹

類的屬性

  • objects:是Manager型別(django中已經定義好的,ORM的核心)的物件,用於與資料庫進行互動
  • 當定義模型類時沒有指定管理器,則Django會為模型類提供一個名為objects的管理器
  • 支援明確指定模型類的管理器
class BookInfo(models.Model):
    ...
    books = models.Manager()   # 自己寫意義不大,一般都用objects,如果自己這樣寫了,預設的objects管理器就沒了
  • 當為模型類指定管理器後,django不再為模型類生成名為objects的預設管理器

管理器Manager

  • 管理器是Django的模型進行資料庫的查詢操作的介面,Django應用的每個模型都擁有至少一個管理器
  • 自定義管理器類主要用於兩種情況
  • 情況一:向管理器類中新增額外的方法:見下面“建立物件”中的方式二
  • 情況二:修改管理器返回的原始查詢集:重寫get_queryset()方法
class BookInfoManager(models.Manager):
    def get_queryset(self):
        return super(BookInfoManager, self).get_queryset().filter(isDelete=False)
class BookInfo(models.Model):
    ...
    books = BookInfoManager()

建立物件

  • 當建立物件時,django不會對資料庫進行讀寫操作
  • 呼叫save()方法才與資料庫互動,將物件儲存到資料庫中
  • 使用關鍵字引數構造模型物件很麻煩,推薦使用下面的兩種之式
  • 說明: _init _方法已經在基類models.Model中使用,在自定義模型中無法使用,
  • 方式一:在模型類中增加一個類方法
class BookInfo(models.Model):
    ...
    @classmethod
    def create(cls, title, pub_date):
        book = cls(btitle=title, bpub_date=pub_date)
        book.bread=0
        book.bcommet=0
        book.isDelete = False
        return book
引入時間包:from datetime import *
呼叫:book=BookInfo.create("hello",datetime(1980,10,11));
儲存:book.save()

例如:
from django.db import models
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')  # db_column:欄位的名稱,如果未指定,則使用屬性的名稱
    bread = models.IntegerField(default=0)  # 閱讀量
    bcommet = models.IntegerField(null=False)  # null=False表示不能為空
    isDelete = models.BooleanField(default=False)

    class Meta:
        db_table = 'bookinfo'  # 預設為booktest_bookinfo

    @classmethod
    def create(cls, btitle, bpub_date):
        b = BookInfo()
        b.btitle = btitle
        b.bpub_date = bpub_date
        b.bread = 0
        b.bcommet = 0
        b.isDelete = False
        return b

進入shell

python manage.py shell

檢視資料庫是否改變


  • 方式二:在自定義管理器中新增一個方法(推薦用)
  • 在管理器的方法中,可以通過self.model來得到它所屬的模型類
class BookInfoManager(models.Manager):
    def create_book(self, title, pub_date):
        book = self.model()
        book.btitle = title
        book.bpub_date = pub_date
        book.bread=0
        book.bcommet=0
        book.isDelete = False
        return book

class BookInfo(models.Model):
    ...
    books = BookInfoManager()
呼叫:book=BookInfo.books.create_book("abc",datetime(1980,1,1))
儲存:book.save()

例如:
from django.db import models


class BookInfoManager(models.Manager):
    def create(cls, btitle, bpub_date):
        b = BookInfo()
        b.btitle = btitle
        b.bpub_date = bpub_date
        b.bread = 0
        b.bcommet = 0
        b.isDelete = False
        return b


class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField(db_column='pub_date')  # db_column:欄位的名稱,如果未指定,則使用屬性的名稱
    bread = models.IntegerField(default=0)  # 閱讀量
    bcommet = models.IntegerField(null=False)  # null=False表示不能為空
    isDelete = models.BooleanField(default=False)

    class Meta:
        db_table = 'bookinfo'  # 預設為booktest_bookinfo
    book1 = BookInfoManager()  # 作為模型類的屬性用  管理器是模型類中的屬性,用於將物件與資料對映

同樣進入shell

from booktest.models import BookInfo

from datetime import datetime

b = BookInfo.book1.create('a',datetime(2019,1,5))   (book1是管理器)方法1中是:b=BookInfo.create('gt',datetime(2019,1,5))

b.save()

 
  • 在方式二中,可以呼叫self.create()建立並儲存物件,不需要再手動save()
class BookInfoManager(models.Manager):
    def create_book(self, title, pub_date):
        book = self.create(btitle = title,bpub_date = pub_date,bread=0,bcommet=0,isDelete = False)
        return book

class BookInfo(models.Model):
    ...
    books = BookInfoManager()
呼叫:book=Book.books.create_book("abc",datetime(1980,1,1))
檢視:book.pk

例項的屬性

  • DoesNotExist:在進行單個查詢時,模型的物件不存在時會引發此異常,結合try/except使用

例項的方法

  • str (self):重寫object方法,此方法在將物件轉換成字串時會被呼叫
  • save():將模型物件儲存到資料表中
  • delete():將模型物件從資料表中刪除