ORM 對象關係映射html
Django中的ormpython
第一步:先在Django項目的settings.py文件中,配置數據庫鏈接信息mysql
DATABASES = { "default": { "ENGINE": "django.db.backends.mysql", "NAME": "你的數據庫名稱", # 須要本身手動建立數據庫 "USER": "數據庫用戶名", "PASSWORD": "數據庫密碼", "HOST": "數據庫IP", "POST": 3306 } }
第二步:在Django項目的__init__.py文件中寫以下代碼,告訴Django使用pymysql模塊連接的數據庫git
import pymysql
pymysql.install_as_MySQLdb()
modelsql
說明:數據庫
1.表名是自動生成的,若是要自定義表名:django
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語句app
4.Django支持MySQL5.5及更高版本spa
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
默認建立第三張表時,數據庫中表的名稱