Django模型層之單表操做

1、單表操做之建立表

在app的models.py文件中建立模型:python

from django.db import models

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    publish = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    price = models.DecimalField(max_digits=5,decimal_places=2)
    date = models.DateField()

更多字段和參數:mysql

1.字段:git

AutoField(Field)  #當model中若是沒有自增列,則會自動建立一個列名爲id的列
    -int 自增列,必須填入參數primary_key=True
SmallIntegerField(IntegerField):
    - 小整數 -32768 ~ 32767
PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正小整數 0 ~ 32767
IntegerField(Field)
    - 整數列(有符號的) -2147483648 ~ 2147483647
PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
    - 正整數 0 ~ 2147483647
BigIntegerField(IntegerField):
    - 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807
BooleanField(Field)
    - 布爾值類型
NullBooleanField(Field):
    - 能夠爲空的布爾值
CharField(Field)
    - 字符類型
    - 必須提供max_length參數, max_length表示字符長度
TextField(Field)
    - 文本類型
EmailField(CharField):
    - 字符串類型,Django Admin以及ModelForm中提供驗證機制
IPAddressField(Field)
    - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制
GenericIPAddressField(Field)
    - 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6
    - 參數:
        protocol,用於指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
        unpack_ipv4, 若是指定爲True,則輸入::ffff:192.0.2.1時候,可解析爲192.0.2.1,開啓刺功能,須要protocol="both"
URLField(CharField)
    - 字符串類型,Django Admin以及ModelForm中提供驗證 URL
SlugField(CharField)
    - 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數字、下劃線、鏈接符(減號)
CommaSeparatedIntegerField(CharField)
    - 字符串類型,格式必須爲逗號分割的數字
UUIDField(Field)
    - 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證
FilePathField(Field)
    - 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能
    - 參數:
            path,                      文件夾路徑
            match=None,                正則匹配
            recursive=False,           遞歸下面的文件夾
            allow_files=True,          容許文件
            allow_folders=False,       容許文件夾
FileField(Field)
    - 字符串,路徑保存在數據庫,文件上傳到指定目錄
    - 參數:
       upload_to = ""      上傳文件的保存路徑
       storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage

ImageField(FileField)
    - 字符串,路徑保存在數據庫,文件上傳到指定目錄
    - 參數:
        upload_to = ""      上傳文件的保存路徑
        storage = None      存儲組件,默認django.core.files.storage.FileSystemStorage
        width_field=None,   上傳圖片的高度保存的數據庫字段名(字符串)
        height_field=None   上傳圖片的寬度保存的數據庫字段名(字符串)

DateTimeField(DateField)
    - 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]

DateField(DateTimeCheckMixin, Field)
    - 日期格式      YYYY-MM-DD

TimeField(DateTimeCheckMixin, Field)
    - 時間格式      HH:MM[:ss[.uuuuuu]]

DurationField(Field)
    - 長整數,時間間隔,數據庫中按照bigint存儲,ORM中獲取的值爲datetime.timedelta類型

FloatField(Field)
    - 浮點型

DecimalField(Field)
    - 10進制小數
    - 參數:
        max_digits,小數總長度
        decimal_places,小數位長度

BinaryField(Field)
    - 二進制類型

2.參數sql

1.null
若是未True,Django將用NULL來在數據庫中存儲空值,默認爲false

2.blank
若是未True,該字段容許爲空,默認爲False。
注:與null不一樣。null是數據庫範疇,blank是數據驗證

3.default
字段默認值

4.primary_key
若是未True,那麼這個字段就是模型的主鍵。若是沒有指定,Django會自動添加一個IntegerField字段做爲主鍵

5.unique
該字段的值在表中惟一

6.choices
由二元組組成的一個可迭代對象(例如,列表或元組),用來給字段提供選擇項。 若是設置了choices ,默認的表單將是一個選擇框而不是標準的文本框,<br>並且這個選擇框的選項就是choices 中的選項。

元信息:數據庫

class UserInfo(models.Model):
    nid = models.AutoField(primary_key=True)
    username = models.CharField(max_length=32)
    class Meta:
        # 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名
        db_table = "table_name"

        # 聯合索引
        index_together = [
            ("pub_date", "deadline"),
        ]

        # 聯合惟一索引
        unique_together = (("driver", "restaurant"),)

        # admin中顯示的表名稱
        verbose_name

        # verbose_name加s
        verbose_name_plural

setting配置:django

若是想要將模型轉爲mysql數據庫中的表,須要在setting中配置:app

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'book',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': '123456'
    }
}
'''
'NAME':要鏈接的數據庫,鏈接前須要建立好
'USER':鏈接數據庫的用戶名
'PASSWORD':鏈接數據庫的密碼
'HOST':鏈接主機,默認本機
'PORT':端口 默認3306
'ATOMIC_REQUEST': True,
設置爲True統一個http請求對應的全部sql都放在一個事務中執行(要麼全部都成功,要麼全部都失敗)。
是全局性的配置, 若是要對某個http請求放水(而後自定義事務),能夠用non_atomic_requests修飾器 
'OPTIONS': {
             "init_command": "SET storage_engine=MyISAM",
            }
設置建立表的存儲引擎爲MyISAM,INNODB
'''

而後,啓動項目,會報錯:no module named MySQLdb 。這是由於django默認你導入的驅動是MySQLdb,但是MySQLdb 對於py3有很大問題,因此咱們須要的驅動是PyMySQL 因此,咱們只須要找到項目名文件下的__int__,在裏面寫入:atom

import pymysql
pymysql.install_as_MySQLdb()

最後經過兩條數據庫遷移命令便可在指定的數據庫中建立表:spa

python35 manage.py makemigrathons
python35 manage.py migrate

注意:rest

1.數據庫遷移記錄都在app下的migrations中
2.使用showmigration命令能夠查看沒有執行migrate的文件
3.makemigrations是生成一個文件,migrate是將更改提交到數據庫

2、在Python腳本中調用Django環境

import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "book.settings")
    import django
    django.setup()

    from app01 import models
    book = models.Book.objects.create(name='python全棧',author='egon',publish='老男孩出版',price='78.2',date='2018-1-1')
    print(book)

3、單表操做

一、添加表記錄

方式一:返回結果是一個對象

# create方法的返回值book_obj就是插入book表中的紅樓夢這本書籍紀錄對象
book_obj=models.Book.objects.create(name='紅樓夢',price=23.8,publish='人民出版社',author='曹雪芹',create_data='2018-09-17')

方式二:先實例化產生對象,而後調用save方法保存

book_obj=models.Book(name='水滸傳',price=99,publish='清華出版社',author='施耐庵',create_data='2017-09-17')
book_obj.save()

二、刪除表記錄

方式一:

ret=models.Book.objects.filter(name='紅樓夢').delete()
# ret返回的是被影響行數,queryset對象的.delete()方法
若是存在多本紅樓夢將會被所有刪除

方式二:

ret=models.Book.objects.filter(name='紅樓夢').first()
ret.delete()
只刪除一個

注:刪除前應先查詢

三、修改表記錄

方式一:

ret=models.Book.objects.filter(name='紅樓夢').update(price=20.9)

方式二:

對象沒有update方法,可是能夠用save來修改
book=models.Book.objects.filter(name='紅樓夢').first()
book.price=33
book.save()

四、查詢表記錄

1.all() 查詢全部結果 
models.Book.objects.all()

2.filter(**kwargs) 指定條件查詢   filter內可傳多個參數,逗號分隔,他們之間是and關係
models.Book.objects.filter(name='紅樓夢').first()
或者models.Book.objects.filter(name='紅樓夢')[0]
注:不支持負數

3.get(**kwargs) 有且只有一個結果,返回的是對象,不是queryset對象,一般使用id查詢 
ret=Book.objects.get(name='紅樓夢') 不存在或超過一個會報錯

4.exclude(**kwargs) 返回與篩選對象不匹配的對象
models.Book.objects.exclude(price>40)

5.order_by() 對查詢結果排序
models.Book.objects.all().order_by('price') 默認升序
倒序:models.Book.objects.all().order_by('-price')
能夠傳多個參數,逗號隔開。

6.reverse() 對查詢結果反向排序

7.count()查詢結果的個數

8.first()返回第一條記錄   last()返回最後一條記錄

9.exists()若是queryset包含數據就返回True,不然返回False
models.Book.objects.filter(name='紅樓夢').exists()

10.values()  queryset對象裏套字典

11.values_list() 返回元組序列,values返回的是一個字典序列

12.distinct()從結果中剔除重複記錄

-----------------------------------------------------------
基於雙下劃線的模糊查詢
1.大於__gt
models.Book.objects.filter(price__gt='89')

2.小於__lt=
models.Book.objects.filter(price__lt='99')

3.小於等於__lte=
models.Book.objects.filter(price__lte='99')

4.大於等於__gte
models.Book.objects.filter(price__gte='89')

5.in在XX中
ret=models.Book.objects.filter(price__in=['23.8','89','100'])

6.range 在xx範圍內 between and
ret=models.Book.objects.filter(price__range=[50,100])

7.contains 查詢名字帶有 紅 字的書
models.Book.objects.filter(name__contains='')

8.icontains 查詢名字帶p的書,忽略大小寫
models.Book.objects.filter(name__icontains='P')

9.startswith 以XX開頭
models.Book.objects.filter(name__startswith='')

10.endwith 以xx結尾
models.Book.objects.filter(name__endwith='')

11.__year按年查詢
models.Book.objects.filter(create_data_year='2018')
相關文章
相關標籤/搜索