1. 程式人生 > >Django Orm 常用字段和參數

Django Orm 常用字段和參數

定義 所有 外鍵關聯 com you ack self. nec pymysql

ORM 對象關系映射

Django中的orm

第一步:先在Django項目的settings.py文件中,配置數據庫連接信息

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "你的數據庫名稱",  # 需要自己手動創建數據庫
        "USER": "數據庫用戶名",
        "PASSWORD": "數據庫密碼",
        "HOST": "數據庫IP",
        "POST": 3306
    }
}

第二步:在Django項目的__init__.py文件中寫如下代碼,告訴Django使用pymysql模塊鏈接的數據庫

import pymysql

pymysql.install_as_MySQLdb()

model

技術分享圖片

說明:

  1.表名是自動生成的,如果要自定義表名:

  

class Author(models.Model):
    name=models.CharField(max_length=32)
    books=models.ManyToManyField(to=Book,db_table=author2book)#多對多建立關系時生成第三張表自定義表名
    class Meta:
        db_table = author#自定義表名

  2.id字段是自動添加的,如果你想要指定自定義主鍵,只需在其中一個字段中指定primary_key=True即可。如果Django發現你已經明確地設置了Field.primary_key,它將不會添加自動id列。

  3.Django會根據配置文件中指定的數據庫後端類型來生成相應的SQL語句

  4.Django支持MySQL5.5及更高版本

Django ORM一般操作

all()查詢所有結果

    ret=models.Book.objects.all()
    print(ret)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎樣練成的>, <Book: 番茄的十種做法>]>

filter(**kwargs)它包含了與所給篩選條件相匹配的對象

    ret=models.Publisher.objects.filter(id=1
) print(ret)#<QuerySet [<Publisher: 我是垃圾出版社>]>

get(**kwargs)返回與所給篩選條件相匹配的對象,返回結果有且只有一個,如果符合篩選條件的對象超過一個或者沒有就會拋出錯誤

    ret = models.Publisher.objects.get(id=1)
    print(ret)#我是垃圾出版社
    ret = models.Publisher.objects.get(name=我是垃圾出版社)
    print(ret)#app01.models.MultipleObjectsReturned: get() returned more than one Publisher -- it returned 2!

exclude(**kwargs)它包含了與所給篩選條件不匹配的對象

    ret = models.Publisher.objects.exclude(id=1)
    print(ret)#<QuerySet [<Publisher: 超神出版社>]>

values(*field)返回一個ValueQuerySet一個特殊的QuerySet,運行後得到的並不是一系列model的實例化對象,而是一個可叠代的字典序列

    ret = models.Publisher.objects.values()
    print(ret)#<QuerySet [{id: 1, name: 我是垃圾出版社, city: 上海}, {id: 2, name: 超神出版社, city: 北京}]>
    print(ret[0])#{id: 1, name: 我是垃圾出版社, city: 上海}
    print(ret[0][name])#我是垃圾出版社
    ret1 = models.Publisher.objects.values(id,name)
    print(ret1)#<QuerySet [{id: 1, name: 我是垃圾出版社}, {id: 2, name: 超神出版社}]>

values_list(*field)它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列

    ret = models.Publisher.objects.values_list()
    print(ret)#<QuerySet [(1, 我是垃圾出版社, 上海), (2, 超神出版社, 北京)]>
    print(ret[0])#(1, 我是垃圾出版社, 上海)
    print(ret[0][1])#我是垃圾出版社
    ret1 =  models.Publisher.objects.values_list(id,name)
    print(ret1)#<QuerySet [(1, 我是垃圾出版社), (2, 超神出版社)]>

order_by(*field)對查詢結果排序

    from app01 import models
    ret = models.Book.objects.order_by(title)
    print(ret)#<QuerySet [<Book: 我是小三>, <Book: 未成年心理學>, <Book: 渣男是怎樣練成的>, <Book: 番茄的十種做法>]>
    ret1 = models.Book.objects.order_by(price)
    print(ret1)#<QuerySet [<Book: 番茄的十種做法>, <Book: 未成年心理學>, <Book: 渣男是怎樣練成的>, <Book: 我是小三>]>默認升序

reverse()對查詢結果反向排序,請註意reverse()通常只能在具有已定義順序的QuerySet上調用(在model類的Meta中指定ordering或調用order_by()方法)

    from app01 import models
    ret = models.Book.objects.order_by(title).reverse()
    print(ret)#<QuerySet [<Book: 番茄的十種做法>, <Book: 渣男是怎樣練成的>, <Book: 未成年心理學>, <Book: 我是小三>]>
    ret1 = models.Book.objects.order_by(price).reverse()
    print(ret1)#<QuerySet [<Book: 我是小三>, <Book: 渣男是怎樣練成的>, <Book: 未成年心理學>, <Book: 番茄的十種做法>]>

distinct()去重

    ret4 = models.Book.objects.filter(Q(author__name=西方不敗)|Q(author__name=垃圾東瀛)).distinct()
    print(ret4)

count()返回數據庫中匹配查詢(QuerySet)的對象數量

    from app01 import models
    ret = models.Book.objects.filter(title__icontains=).count()
    print(ret)#2

first()返回第一條記錄

    from app01 import models
    ret = models.Book.objects.first()
    print(ret)#我是小三

last()返回最後一條記錄

    from app01 import models
    ret = models.Book.objects.last()
    print(ret)#未成年心理學

exists()如果QuerySet包含數據,就返回True,否則返回Flase

    from app01 import models
    ret = models.Author.objects.exists()
    print(ret)#True

Django ORM 常用字段和參數

常用字段

AutoField

int自增列,必須填入參數primary_key=True。如果沒有自增列會自動生成一個id自增列

from django.db import models

class User(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=16)

class Publisher(models.Model):
  #沒有自增列 會自動增加id自增列 name
= models.CharField(max_length=32)

IntegerField

一個整數類型,-2147483648 to 2147483647

因為整數類型只有十位所以手機號 證件號之類的都不可以用它來存

CharField

字符類型,必須提供max_length參數,max_length表示字符長度

class Author(models.Model):
    name = models.CharField(max_length=32)

字符類型相當於數據庫裏的varchar類型

我們可以自定義一個char

class zhangxiangyucharField(models.Field):
    def __init__(self,max_length,*args,**kwargs):
        self.max_length=max_length
        super().__init__(max_length=max_length,*args,**kwargs)

    def db_type(self,connection):
        return char(%s)%self.max_length

DateField

日期字段,日期格式 YYYY-MM-DD,相當於python中的datetime.date()實例

class Book(models.Model):
    title = models.CharField(max_length=32)
    publish_date = models.DateField(auto_now_add=True)
#auto_now_add添加值的時候時間就固定了,而auto_now每次改變值的時候都會更新一次時間  

DateTimeField

日期時間字段,格式YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當於python中的datetime.datetime()實例

字段合集(爭取記憶)

https://www.cnblogs.com/liwenzhou/p/8688919.html

orm字段和數據庫實際字段的對應關系

技術分享圖片

字段參數

null

用於表示某個字段可以為空

class Publisher(models.Model):
    name=models.CharField(max_length=32,null=True)

技術分享圖片

unique

如果設置為unique=True 則該字段在此表中必須是唯一的

class Publisher(models.Model):
    name=models.CharField(max_length=32,unique=True)

技術分享圖片

db_index

如果db_index=True則代表著為此字段設置索引

defaul

為該字段設置默認值

class Publisher(models.Model):
    name=models.CharField(max_length=32,default=張相玉帥哥)

關系字段

ForeignKey

外鍵類型在ORM中用來表示外鍵關聯關系,一般把ForeignKey字段設置在‘一對多‘中‘多‘的一方

ForeignKey可以和其他表做關聯關系同時也可以和自身做關聯關系

to

設置要關聯的表

to_field

設置要關聯的表的字段

related_name

反向操作時,使用的字段名,用於代替原反向查詢時的‘表名_set‘。

技術分享圖片

related_query_name

反向查詢操作時,使用的連接前綴,用於替換表名

from django.db import models

# Create your models here.

class Book(models.Model):
    title = models.CharField(max_length=32)
    publish_date = models.DateField(auto_now_add=True)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    # 創建外鍵,關聯publish
    publisher = models.ForeignKey(to="Publisher" ,related_name=books,related_query_name=zhangshuaige)
    # 創建多對多關聯author
    author = models.ManyToManyField(to="Author")

    def __str__(self):
        return self.title
import os

if __name__ == __main__:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xianzai.settings")
    import django
    django.setup()
    from app01 import models

    publisher_obj=models.Publisher.objects.first()
    如果設置了related_name=books
    ret=publisher_obj.books.all()
    print(ret[0])

    #如果設置了 related_query_name=zhangshuaige
    ret=models.Publisher.objects.filter(id=1).values(zhangshuaige__title)
    print(ret)

on_delete

當刪除關聯表中的數據時,當前表與其關聯的行的行為

OneToOneField

一對一字段

通常一對一字段用來擴展已有字段。

to 設置要關聯的表

to_field 設置要關聯的字段

on_delete

ManyToManyField

用於表示多對多的關聯關系。在數據庫中通過第三張表來建立關聯關系

to related_name related_query_name 同ForeignKey字段

through

設置第三張表的表名

class Author(models.Model):
    name=models.CharField(max_length=32)
    books=models.ManyToManyField(
        to=Book,
        through=Book2Author,
        through_fields=(author,book)
    )

through_fields

設置關聯的字段

db_table

默認創建第三張表時,數據庫中表的名稱

技術分享圖片

Django Orm 常用字段和參數