1. 程式人生 > >Django-ORM-單表操作

Django-ORM-單表操作

ORM欄位引數及單表操作

一、欄位引數

1.欄位

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.引數

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 中的選項。

補充:

  1. 資料庫遷移記錄都在 app下的migrations裡
  2. 使用showmigrations命令可以檢視沒有執行migrate的檔案
  3. makemigrations是生成一個檔案,migrate是將更改提交到資料量

二、單表操作

1.新增表記錄

方式一:返回結果是一個物件

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

2.刪除表記錄

刪除前要先查詢

方式一:

ret=models.Book.objects.filter(name='紅樓夢').delete()
# ret返回的是被影響行數,queryset物件的.delete()方法
如果存在多本紅樓夢將會被全部刪除

方式二:

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

3.修改表記錄

方式一:

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

方式二:

物件沒有update方法,但是可以用save來修改
book=models.Book.objects.filter(name='紅樓夢').first()
book.price=33
book.save()

4.查詢表記錄

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