ORM經常使用字段及參數,事務及其餘

ORM經常使用字段及參數,事務及其餘

一、models經常使用字段及參數

字段後設置屬性verbose_name=' ' 能夠將該字段在admin後臺以中文名展現git

一、經常使用字段

一、主鍵字段:AutoField(primary_key = True) 能夠不寫Django會自動添加一個名爲id的主鍵字段,必須填primary_key = True數據庫

二、varchar(32):CharField(max_length = 32,verbose_name='名字') Django只有varchar字符類型字段,且必需要寫max_lengthdjango

三、int:IntegerField() 整型能夠不傳數字,默認是11位框架

四、bigint:BigIntegerField() 長整型,存更多的數字fetch

五、decimal:DecimalField(max_digits=8, decimal_places=2) 存小數數字總共max_digits,小數位decimal_places優化

六、date:DateField() 存年月日日期,能夠設置格式化時間,能夠傳auto_now和auto_now_addatom

  auto_now:每次編輯數據的時候都會自動更新該字段時間url

  auto_now_add:只在建立的時候自動更新spa

七、datetime:DateTimeField() 存年月日時分秒,能夠設置格式化時間,能夠傳auto_now 和 auto_now_addcode

  auto_now:每次編輯數據的時候都會自動更新該字段時間

  auto_now_add:只在建立的時候自動更新

八、varchar(254):EmailField()

九、bool:BooleanField() 給該字段傳佈爾值會對應生成數字 0/1

十、文本類型:TextField 能夠存儲大段文本

十一、FileField(upload_to=" ") 字符串路徑保存到數據庫,文件上傳到指定的目錄,給該字段傳文件對象,文件會自動保存到upload_to指定的文件夾下

十二、ImageField(upload_to="文件夾", default="設置文件夾下的默認圖片")

二、自定義類型字段

咱們以自定義一個char類型字段爲例

一、默認字段都繼承了Field類,咱們先導入Field

from django.db.models import Field

二、自定義char類型字段繼承Field

class MyCharField(Field):
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length  # 攔截父類的方法,操做完後利用super調用父類的方法
        super().__init__(max_length=max_length, *args, **kwargs)
    
    def db_type(self, connection):
        return "char(%s)"%self.max_length

三、自定義後使用

class Movie(models.Model):
    title = MyCharField(max_length=64)

三、字段類的關鍵性參數

null:通常在一張表中已經有字段了,再新添加一個字段時使用設置爲null=True,也能夠新建字段時設置能夠爲空

default:通常在一張表中已經有字段了,再新添加一個字段時使用設置以前的數據該字段默認值,也能夠初始設置一個默認值數據

Django 1.x版本使用的是級聯更新級聯刪除,2.x版本須要手動指定

二、choices參數

當數據可以被列舉完,能夠供用戶選擇的時候,能夠考慮用choices參數,好比性別,學歷,婚否等等

# choices字段
class Userinfo(models.Model):
    username = models.CharField(max_length=32)
    gender_choices = (
        (1,''),
        (2,''),
        (3,'其餘'),
    )
    gender = models.IntegerField(choices=gender_choices)
    # 該字段仍是存數字 而且能夠匹配關係以外的數字
    # 該字段還能夠存字符串
    record_choices = (
        ('vacate', "請假"),
        ('late', "遲到"),
        ('noshow', "缺勤"),
        ('leave_early', "早退"),
    )
    record = models.CharField('上課記錄', choices=record_choices, default='checked', max_length=32)

二、使用choices,取值的時候使用對象.get_xxx_display()來獲取choices後面具體的值,當choices中沒有該數據對應的時候獲取的仍是數字自己

    user_obj = models.Userinfo.objects.get(pk=1)
    # 針對choices參數字段 取值的時候   get_xxx_display()
    print(user_obj.get_gender_display())  #
    # 針對沒有註釋信息的數據  get_xxx_display()獲取到的仍是數字自己
    user_obj = models.Userinfo.objects.get(pk=4)
    print(user_obj.get_gender_display())   # 4

三、ORM查詢優化

查詢時想看見SQL原生語句能夠在配置文件中配置一下

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

Django的ORM查詢都是惰性查詢,即不使用該查詢獲得的對象時,即便寫了該條查詢語句也不會去數據庫中查詢,只有當後面使用到了纔會去數據庫中查詢

一、only與defer

only的做用:括號內傳字段,獲得的結果是一個列表套數據對象,該對象內只含有括號內指定的字段屬性,對象點該字段屬性是不會走數據庫的,可是一旦點了非括號內的字段也能夠拿到數據,可是要從新走數據庫

res = models.Publish.objects.only('name')
    for i in res:
        # print(i.name)  # 括號中數據是only內的屬性只會查詢一次
        print(i.addr)  # 括號中數據不是only查詢的每個都會從新去數據庫中查找

defer的做用:與only相反,獲得的結果是列表套數據對象,經過對象點括號內的字段會重複走數據庫查詢,當對象點非括號內的字段就不會走數據庫

    res = models.Book.objects.defer('name')
    for i in res:
        # print(i.name)  # 括號中數據是only內的屬性每次查詢會重複查詢數據庫
        print(i.price)  # 括號中字段不是defer內字段,查詢只會查詢一次

二、select_related與prefetch_related

select_related: 內部時連表操做,將關係表所有連接起來,以後再一次性查詢封裝到對象中,再經過對象點屬性就不須要走數據庫了,select_related括號內只能是外鍵字段,而且不能是多對多,只能能是一對一或一對多

    res = models.Book.objects.select_related('publish')
    for i in res:
        # print(i.publish.name)
        print(i.publish.addr)

prefetch_related:內部時子查詢,可是感受像是連表操做,其實內部時子查詢將所有的封裝到對象中以後對象點當前表或者關聯表中字段就不須要走數據庫了

    res = models.Book.objects.prefetch_related('publish')
    for i in res:
        # print(i.publish.name)
        print(i.publish.addr)

select_related與prefetch_related優缺點比較:

  select_related連表操做 只走一個SQL查詢,耗時耗在連表操做

  prefetch_related子查詢 走兩次SQL查詢耗時耗在查詢次數

四、Django的ORM中的事務操做

事務的四大特性ACID:原子性、一致性、隔離性、持久性(在數據庫中講過此處就不細講了)

一、Django ORM開啓事務:

from django.db import transaction

二、使用事務

with transaction.atomic():
    # 在with代碼塊中執行ORM語句屬於同一個事務,代碼塊運行結束事務就結束了

五、MTV與MVC模型

MTV:Django號稱MTV框架,其實本質上也是MVC

  M:models 模型層

  T:templates 模板層

  V:views 視圖層

MVC:

  M:models 模型層

  V:views 視圖層

  C: controller 控制器(路由分發 urls.py)

相關文章
相關標籤/搜索