DJango模型,字段,元選項,管理器.

定義模型

定義模型的注意事項及特性說明.
1. 在模型中定義屬性,會生成表中的字段
2. django根據屬性的類型確定以下信息:
3. 當前選擇的數據庫支持字段的類型
4. 渲染管理表單時使用的默認html控件
5. 在管理站點最低限度的驗證
6. django會爲表增加自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性爲主鍵列後,則django不會再生成默認的主鍵列
7. 屬性命名限制
8. 不能是python的保留關鍵字
9. 由於django的查詢方式,不允許使用連續的下劃線

字段類型

AutoField:一個根據實際ID自動增長的IntegerField,通常不指定,如果不指定,一個主鍵字段將自動添加到模型中
BooleanField:true/false 字段,此字段的默認表單控制是CheckboxInput
NullBooleanField:支持nulltruefalse三種值
CharField(max_length=字符長度):字符串,默認的表單樣式是 TextInput
TextField:大文本字段,一般超過4000使用,默認的表單控件是Textarea
IntegerField:整數
DecimalField(max_digits=None, decimal_places=None):使用python的Decimal實例表示的十進制浮點數
DecimalField.max_digits:位數總數
DecimalField.decimal_places:小數點後的數字位數
FloatField:用Python的float實例來表示的浮點數
DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date實例表示的日期
    參數DateField.auto_now:每次保存對象時,自動設置該字段爲當前時間,用於"最後一次修改"的時間戳,它總是使用當前日期,默認爲false
    參數DateField.auto_now_add:當對象第一次被創建時自動設置當前時間,用於創建的時間戳,它總是使用當前日期,默認爲false
    該字段默認對應的表單控件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日曆控件,和一個“Today"的快捷按鈕,包含了一個額外的invalid_date錯誤消息鍵
auto_now_add, auto_now, and default 這些設置是相互排斥的,他們之間的任何組合將會發生錯誤的結果
TimeField:使用Python的datetime.time實例表示的時間,參數同DateField
DateTimeField:使用Python的datetime.datetime實例表示的日期和時間,參數同DateField
FileField:一個上傳文件的字段
ImageField:繼承了FileField的所有屬性和方法,但對上傳的對象進行校驗,確保它是個有效的image

字段選項

通過字段選項,可以實現對字段的約束

在創建字段對象時通過關鍵字參數指定
null:如果爲True,Django 將空值以NULL 存儲到數據庫中,默認值是 False
blank:如果爲True,則該字段允許爲空白,默認值是 False
對比:null是數據庫範疇的概念,blank是表單驗證證範疇的
db_column:字段的名稱,如果未指定,則使用屬性的名稱
db_index:若值爲 True, 則在表中會爲此字段創建索引
default:默認值
primary_key:若爲 True, 則該字段會成爲模型的主鍵字段
unique:如果爲 True, 這個字段在表中必須有唯一值

關係

關係的類型包括
    ForeignKey:一對多,將字段定義在多的端中
    ManyToManyField:多對多,將字段定義在兩端中
    OneToOneField:一對一,將字段定義在任意一端中

用一訪問多:對象.模型類小寫_set
bookinfo.heroinfo_set
用一訪問一:對象.模型類小寫
heroinfo.bookinfo
訪問id:對象.屬性_id
heroinfo.book_id

元選項

在模型類中定義類Meta,用於設置元信息
元信息db_table:定義數據表名稱,推薦使用小寫字母,
ordering:對象的默認排序字段,獲取對象的列表時使用,接收屬性構成的列表

管理器

當定義模型類時沒有指定管理器,則Django會爲模型類提供一個名爲objects的管理器
objects:是Manager類型的對象,用於與數據庫進行交互
當爲模型類指定管理器後,django不再爲模型類生成名爲objects的默認管理器
管理器是Django的模型進行數據庫的查詢操作的接口,Django應用的每個模型都擁有至少一個管理器

自定義管理器的兩種方法;

1.向管理類中添加額外的方法
2.修改管理器返回的原始查詢集
class BookInfoManager(models.Manager):
    # 該管理器將原始的查詢集進行了篩選,值顯示未被邏輯刪除的
    def get_queryset(self):
        return super(BookInfoManager, self).get_queryset().filter(isDelete=False)
class BookInfo(models.Model):
    ...
    books = BookInfoManager()

調用的時候就不能調用默認的管理器object了

調用方法:
    BookInfo.books.all(),返回結果管理器篩選之後的對象的一個類列表的數據,但實際上不是列表

快速的爲對象添加屬性

方法一

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()

方法二

class BookInfoManager(models.Manager):
    def create_book(self, title, pub_date):
        # 調用父類的create方法,直接創建並保存
        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

也可以在模型類中使用類方法來完成,但不建議使用.

一個簡單的模型類示例

from django.db import models


class BookInfoManage(models.Manager):
    def get_queryset(self):
        return super(BookInfoManage,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)
    bcommet = models.IntegerField(default=0)
    isDelete = models.BooleanField(default=False)
    books = models.Manager()
    books2 = BookInfoManage()
    class Meta():
        db_table = 'bookinfo'

    def __str__(self):
        return self.btitle.encode('utf-8')

class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)
    hgender = models.BooleanField(default=True)
    hbook = models.ForeignKey('BookInfo')
    hcontent = models.CharField(max_length=100)
    isDelete = models.BooleanField(default=False)

    def __str__(self):
        return self.hname.encode('utf-8')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章