Django Model裏的ORM映射關係總結:一,到目前爲止,當咱們的程序涉及到數據庫相關操做時,咱們通常都會這麼搞: 建立數據庫,設計表結構和字段 使用 MySQLdb 來鏈接數據庫,並編寫數據訪問層代碼 業務邏輯層去調用數據訪問層執行數據庫操做二,django中遵循 Code Frist 的原則,即:根據代碼中定義的類來自動生成數據庫表。1,建立表基本結構:from django.db import modelsclass userinfo(models.Model):name = models.CharField(max_length=30)email = models.EmailField()memo = models.TextField()AutoField(Field) - int自增列,必須填入參數 primary_key=TrueBigAutoField(AutoField) - bigint自增列,必須填入參數 primary_key=True注:當model中若是沒有自增列,則自動會建立一個列名爲id的列IntegerField(Field) - 整數列(有符號的) -2147483648 ~ 2147483647CharField(Field) - 字符類型 - 必須提供max_length參數, max_length表示字符長度TextField(Field) - 文本類型EmailField(CharField) - 字符串類型,Django Admin以及ModelForm中提供驗證機制IPAddressField(Field) - 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制ImageField(FileField) - 字符串,路徑保存在數據庫,文件上傳到指定目錄- 參數: upload_to = "" 上傳文件的保存路徑 storage = None 存儲組件,默認django.core.files.storage.FileSystemStorage width_field=None, 上傳圖片的高度保存的數據庫字段名(字符串) height_field=None 上傳圖片的寬度保存的數據庫字段名(字符串) null 數據庫中字段是否能夠爲空 db_column 數據庫中字段的列名 db_tablespace default 數據庫中字段的默認值 primary_key 數據庫中字段是否爲主鍵 db_index 數據庫中字段是否能夠創建索引 unique 數據庫中字段是否能夠創建惟一索引 unique_for_date 數據庫中字段【日期】部分是否能夠創建惟一索引 unique_for_month 數據庫中字段【月】部分是否能夠創建惟一索引 unique_for_year 數據庫中字段【年】部分是否能夠創建惟一索引 verbose_name Admin中顯示的字段名稱 blank Admin中是否容許用戶輸入爲空 editable Admin中是否能夠編輯 help_text Admin中該字段的提示信息 choices Admin中顯示選擇框的內容,用不變更的數據放在內存中從而避免跨表操做 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)三,連表結構:一對多:models.ForeignKey(其餘表)多對多:models.ManyToManyField(其餘表)一對一:models.OneToOneField(其餘表)應用場景:一對多:當一張表中建立一行數據時,有一個單選的下拉框(能夠被重複選擇) 例如:建立用戶信息時候,須要選擇一個用戶類型【普通用戶】【金牌用戶】【鉑金用戶】等。多對多:在某表中建立一行數據是,有一個能夠多選的下拉框 例如:建立用戶信息,須要爲用戶指定多個愛好一對一:在某表中建立一行數據時,有一個單選的下拉框(下拉框中的內容被用過一次就消失了 例如:原有含10列數據的一張表保存相關信息,通過一段時間以後,10列沒法知足需求,須要爲原來的表再添加5列數據ForeignKey(ForeignObject) # ForeignObject(RelatedField) to, # 要進行關聯的表名 to_field=None, # 要關聯的表中的字段名稱 on_delete=None, # 當刪除關聯表中的數據時,當前表與其關聯的行的行爲四,操做表一、基本操做: # 增 # # models.Tb1.objects.create(c1='xx', c2='oo') 增長一條數據,能夠接受字典類型數據 **kwargs # obj = models.Tb1(c1='xx', c2='oo') # obj.save() # 查 # # models.Tb1.objects.get(id=123) # 獲取單條數據,不存在則報錯(不建議) # models.Tb1.objects.all() # 獲取所有 # models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據 # 刪 # # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數據 # 改 # models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數據更新,均支持 **kwargs # obj = models.Tb1.objects.get(id=1) # obj.c1 = '111' # obj.save() # 修改單條數據二、進階操做:利用雙下劃線將字段和對應的操做鏈接起來 # 獲取個數 # # models.Tb1.objects.filter(name='seven').count() # 大於,小於 # # models.Tb1.objects.filter(id__gt=1) # 獲取id大於1的值 # models.Tb1.objects.filter(id__gte=1) # 獲取id大於等於1的值 # models.Tb1.objects.filter(id__lt=10) # 獲取id小於10的值 # models.Tb1.objects.filter(id__lte=10) # 獲取id小於10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 # in # # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於十一、2二、33的數據 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # isnull # Entry.objects.filter(pub_date__isnull=True) # contains # # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 # models.Tb1.objects.exclude(name__icontains="ven") # range # # models.Tb1.objects.filter(id__range=[1, 2]) # 範圍bettwen and # 其餘相似 # # startswith,istartswith, endswith, iendswith, # order by # # models.Tb1.objects.filter(name='seven').order_by('id') # asc # models.Tb1.objects.filter(name='seven').order_by('-id') # desc # group by # # from django.db.models import Count, Min, Max, Sum # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" # limit 、offset # # models.Tb1.objects.all()[10:20] # regex正則匹配,iregex 不區分大小寫 # # Entry.objects.get(title__regex=r'^(An?|The) +') # Entry.objects.get(title__iregex=r'^(an?|the) +') # date # # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1)) # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1)) # year # # Entry.objects.filter(pub_date__year=2005) # Entry.objects.filter(pub_date__year__gte=2005) # month # # Entry.objects.filter(pub_date__month=12) # Entry.objects.filter(pub_date__month__gte=6) # day # # Entry.objects.filter(pub_date__day=3) # Entry.objects.filter(pub_date__day__gte=3) # week_day # # Entry.objects.filter(pub_date__week_day=2) # Entry.objects.filter(pub_date__week_day__gte=2) # hour # # Event.objects.filter(timestamp__hour=23) # Event.objects.filter(time__hour=5) # Event.objects.filter(timestamp__hour__gte=12) # minute # # Event.objects.filter(timestamp__minute=29) # Event.objects.filter(time__minute=46) # Event.objects.filter(timestamp__minute__gte=29) # second # # Event.objects.filter(timestamp__second=31) # Event.objects.filter(time__second=2) # Event.objects.filter(timestamp__second__gte=31)三、其餘操做 # extra # # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None) # Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) # Entry.objects.extra(where=['headline=%s'], params=['Lennon']) # Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) # Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid']) # F # # from django.db.models import F # models.Tb1.objects.update(num=F('num')+1) # Q # # 方式一: # Q(nid__gt=10) # Q(nid=8) | Q(nid__gt=10) # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') # 方式二: # con = Q() # q1 = Q() # q1.connector = 'OR' # q1.children.append(('id', 1)) # q1.children.append(('id', 10)) # q1.children.append(('id', 9)) # q2 = Q() # q2.connector = 'OR' # q2.children.append(('c1', 1)) # q2.children.append(('c1', 10)) # q2.children.append(('c1', 9)) # con.add(q1, 'AND') # con.add(q2, 'AND') # # models.Tb1.objects.filter(con)四、連表操做(了不得的雙下劃線)user_info_obj = models.UserInfo.objects.get(name=u'武沛齊')user_info_objs = models.UserInfo.objects.all()group_obj = models.UserGroup.objects.get(caption='CEO')group_objs = models.UserGroup.objects.all() # 添加數據 # group_obj.user_info.add(user_info_obj) # group_obj.user_info.add(*user_info_objs) # 刪除數據 # group_obj.user_info.remove(user_info_obj) # group_obj.user_info.remove(*user_info_objs) # 添加數據 # user_info_obj.usergroup_set.add(group_obj) # user_info_obj.usergroup_set.add(*group_objs) # 刪除數據 # user_info_obj.usergroup_set.remove(group_obj) # user_info_obj.usergroup_set.remove(*group_objs) # 獲取數據 # print group_obj.user_info.all() # print group_obj.user_info.all().filter(id=1) # 獲取數據 # print user_info_obj.usergroup_set.all() # print user_info_obj.usergroup_set.all().filter(caption='CEO') # print user_info_obj.usergroup_set.all().filter(caption='DBA')