Django Orm 常用字段和參數
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 常用字段和參數