python manage.py dumpdata blog # 導出blog數據html
python manage.py loaddata blog_dump.json # 導入數據python
model模型git
關係對象映射(Object Relational Mapping,簡稱ORM),根據代碼中定義的類來自動生成數據庫表。web
1 from django.db import models 2 3 class UserInfo(models.Model): 4 name = models.CharField(max_length=30) 5 sex = models.BooleanField() 6 email = models.EmailField() 7 memo = models.TextField()
models.AutoField 自增列 = int(11) 若是沒有的話,默認會生成一個名稱爲 id 的列,若是要顯示的自定義一個自增列,必須將給列設置爲主鍵 primary_key=True。 models.CharField 字符串字段 必須 max_length 參數 models.BooleanField 布爾類型=tinyint(1) 不能爲空,Blank=True models.ComaSeparatedIntegerField 用逗號分割的數字=varchar 繼承CharField,因此必須 max_lenght 參數 models.DateField 日期類型 date 對於參數,auto_now = True 則每次更新都會更新這個時間;auto_now_add 則只是第一次建立添加,以後的更新再也不改變。 models.DateTimeField 日期類型 datetime 同DateField的參數 models.Decimal 十進制小數類型 = decimal 必須指定整數位max_digits和小數位decimal_places models.EmailField 字符串類型(正則表達式郵箱) =varchar 對字符串進行正則表達式 models.FloatField 浮點類型 = double models.IntegerField 整形 models.BigIntegerField 長整形 integer_field_ranges = { 'SmallIntegerField': (-32768, 32767), 'IntegerField': (-2147483648, 2147483647), 'BigIntegerField': (-9223372036854775808, 9223372036854775807), 'PositiveSmallIntegerField': (0, 32767), 'PositiveIntegerField': (0, 2147483647), } models.IPAddressField 字符串類型(ip4正則表達式) models.GenericIPAddressField 字符串類型(ip4和ip6是可選的) 參數protocol能夠是:both、ipv四、ipv6 驗證時,會根據設置報錯 models.NullBooleanField 容許爲空的布爾類型 models.PositiveIntegerFiel 正Integer models.PositiveSmallIntegerField 正smallInteger models.SlugField 減號、下劃線、字母、數字 models.SmallIntegerField 數字 數據庫中的字段有:tinyint、smallint、int、bigint models.TextField 字符串=longtext models.TimeField 時間 HH:MM[:ss[.uuuuuu]] models.URLField 字符串,地址正則表達式 models.BinaryField 二進制 models.ImageField 圖片 models.FilePathField 文件
字段參數: null=True 數據庫中字段是否能夠爲空 blank=True django的 Admin 中添加數據時是否可容許空值 primary_key = False 主鍵,對AutoField設置主鍵後,就會代替原來的自增 id 列 auto_now 和 auto_now_add auto_now 自動建立---不管添加或修改,都是當前操做的時間 auto_now_add 自動建立---永遠是建立時的時間 choices GENDER_CHOICE = ( (u'M', u'Male'), (u'F', u'Female'), ) gender = models.CharField(max_length=2,choices = GENDER_CHOICE) max_length default 默認值 verbose_name Admin中字段的顯示名稱 name|db_column 數據庫中的字段名稱 unique=True 不容許重複 db_index = True 數據庫索引 editable=True 在Admin裏是否可編輯 error_messages=None 錯誤提示 auto_created=False 自動建立 help_text 在Admin中提示幫助信息 validators=[] upload-to
1 null 數據庫中字段是否能夠爲空 2 db_column 數據庫中字段的列名 3 db_tablespace 4 default 數據庫中字段的默認值 5 primary_key 數據庫中字段是否爲主鍵 6 db_index 數據庫中字段是否能夠創建索引 7 unique 數據庫中字段是否能夠創建惟一索引 8 unique_for_date 數據庫中字段【日期】部分是否能夠創建惟一索引 9 unique_for_month 數據庫中字段【月】部分是否能夠創建惟一索引 10 unique_for_year 數據庫中字段【年】部分是否能夠創建惟一索引 11 12 verbose_name Admin中顯示的字段名稱 13 blank Admin中是否容許用戶輸入爲空 14 editable Admin中是否能夠編輯 15 help_text Admin中該字段的提示信息 16 choices Admin中顯示選擇框的內容,用不變更的數據放在內存中從而避免跨表操做 17 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1) 18 19 error_messages 自定義錯誤信息(字典類型),從而定製想要顯示的錯誤信息; 20 字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date 21 如:{'null': "不能爲空.", 'invalid': '格式錯誤'} 22 23 validators 自定義錯誤驗證(列表類型),從而定製想要的驗證規則 24 from django.core.validators import RegexValidator 25 from django.core.validators import EmailValidator,URLValidator,DecimalValidator,\ 26 MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator 27 如: 28 test = models.CharField( 29 max_length=32, 30 error_messages={ 31 'c1': '優先錯信息1', 32 'c2': '優先錯信息2', 33 'c3': '優先錯信息3', 34 }, 35 validators=[ 36 RegexValidator(regex='root_\d+', message='錯誤了', code='c1'), 37 RegexValidator(regex='root_112233\d+', message='又錯誤了', code='c2'), 38 EmailValidator(message='又錯誤了', code='c3'), ] 39 )
1 class UserInfo(models.Model): 2 nid = models.AutoField(primary_key=True) 3 username = models.CharField(max_length=32) 4 class Meta: 5 # 數據庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名 6 db_table = "table_name" 7 8 # 聯合索引 9 index_together = [ 10 ("pub_date", "deadline"), 11 ] 12 13 # 聯合惟一索引 14 unique_together = (("driver", "restaurant"),) 15 16 # admin中顯示的表名稱 17 verbose_name 18 19 # verbose_name加s 20 verbose_name_plural 21 22 更多:https://docs.djangoproject.com/en/1.10/ref/models/options/
1 1.觸發Model中的驗證和錯誤提示有兩種方式: 2 a. Django Admin中的錯誤信息會優先根據Admiin內部的ModelForm錯誤信息提示,若是都成功,纔來檢查Model的字段並顯示指定錯誤信息 3 b. 調用Model對象的 clean_fields 方法,如: 4 # models.py 5 class UserInfo(models.Model): 6 nid = models.AutoField(primary_key=True) 7 username = models.CharField(max_length=32) 8 9 email = models.EmailField(error_messages={'invalid': '格式錯了.'}) 10 11 # views.py 12 def index(request): 13 obj = models.UserInfo(username='11234', email='uu') 14 try: 15 print(obj.clean_fields()) 16 except Exception as e: 17 print(e) 18 return HttpResponse('ok') 19 20 # Model的clean方法是一個鉤子,可用於定製操做,如:上述的異常處理。 21 22 2.Admin中修改錯誤提示 23 # admin.py 24 from django.contrib import admin 25 from model_club import models 26 from django import forms 27 28 29 class UserInfoForm(forms.ModelForm): 30 username = forms.CharField(error_messages={'required': '用戶名不能爲空.'}) 31 email = forms.EmailField(error_messages={'invalid': '郵箱格式錯誤.'}) 32 age = forms.IntegerField(initial=1, error_messages={'required': '請輸入數值.', 'invalid': '年齡必須爲數值.'}) 33 34 class Meta: 35 model = models.UserInfo 36 # fields = ('username',) 37 fields = "__all__" 38 39 40 class UserInfoAdmin(admin.ModelAdmin): 41 form = UserInfoForm 42 43 44 admin.site.register(models.UserInfo, UserInfoAdmin)
數據庫中表與表之間的關係正則表達式
一對多, models.ForeignKey(ColorDic) 一對一, models.OneToOneField(OneModel) 多對多, authors = models.ManyToManyField(Author)
增長:建立實例,並調用save 更新:a.獲取實例,再sava;b.update(指定列) 刪除:a. filter().delete(); b.all().delete() 獲取:a. 單個=get(id=1) ;b. 全部 = all() 過濾:filter(name='xxx');filter(name__contains='');(id__in = [1,2,3]) ; icontains(大小寫無關的LIKE),startswith和endswith, 還有range(SQLBETWEEN查詢)'gt', 'in', 'isnull', 'endswith', 'contains', 'lt', 'startswith', 'iendswith', 'icontains','range', 'istartswith' 排序:order_by("name") =asc ;order_by("-name")=desc 返回第n-m條:第n條[0];前兩條[0:2] 指定映射:values 數量:count() 聚合:from django.db.models import Min,Max,Sum objects.all().aggregate(Max('guest_id'))
model操做sql
1 ForeignKey(ForeignObject) # ForeignObject(RelatedField) 2 to, # 要進行關聯的表名 3 to_field=None, # 要關聯的表中的字段名稱 4 on_delete=None, # 當刪除關聯表中的數據時,當前表與其關聯的行的行爲 5 - models.CASCADE,刪除關聯數據,與之關聯也刪除 6 - models.DO_NOTHING,刪除關聯數據,引起錯誤IntegrityError 7 - models.PROTECT,刪除關聯數據,引起錯誤ProtectedError 8 - models.SET_NULL,刪除關聯數據,與之關聯的值設置爲null(前提FK字段須要設置爲可空) 9 - models.SET_DEFAULT,刪除關聯數據,與之關聯的值設置爲默認值(前提FK字段須要設置默認值) 10 - models.SET,刪除關聯數據, 11 a. 與之關聯的值設置爲指定值,設置:models.SET(值) 12 b. 與之關聯的值設置爲可執行對象的返回值,設置:models.SET(可執行對象) 13 14 def func(): 15 return 10 16 17 class MyModel(models.Model): 18 user = models.ForeignKey( 19 to="User", 20 to_field="id" 21 on_delete=models.SET(func),) 22 related_name=None, # 反向操做時,使用的字段名,用於代替 【表名_set】 如: obj.表名_set.all() 23 related_query_name=None, # 反向操做時,使用的鏈接前綴,用於替換【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名') 24 limit_choices_to=None, # 在Admin或ModelForm中顯示關聯數據時,提供的條件: 25 # 如: 26 - limit_choices_to={'nid__gt': 5} 27 - limit_choices_to=lambda : {'nid__gt': 5} 28 29 from django.db.models import Q 30 - limit_choices_to=Q(nid__gt=10) 31 - limit_choices_to=Q(nid=8) | Q(nid__gt=10) 32 - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') 33 db_constraint=True # 是否在數據庫中建立外鍵約束 34 parent_link=False # 在Admin中是否顯示關聯數據 35 36 37 OneToOneField(ForeignKey) 38 to, # 要進行關聯的表名 39 to_field=None # 要關聯的表中的字段名稱 40 on_delete=None, # 當刪除關聯表中的數據時,當前表與其關聯的行的行爲 41 42 ###### 對於一對一 ###### 43 # 1. 一對一其實就是 一對多 + 惟一索引 44 # 2.當兩個類之間有繼承關係時,默認會建立一個一對一字段 45 # 以下會在A表中額外增長一個c_ptr_id列且惟一: 46 class C(models.Model): 47 nid = models.AutoField(primary_key=True) 48 part = models.CharField(max_length=12) 49 50 class A(C): 51 id = models.AutoField(primary_key=True) 52 code = models.CharField(max_length=1) 53 54 ManyToManyField(RelatedField) 55 to, # 要進行關聯的表名 56 related_name=None, # 反向操做時,使用的字段名,用於代替 【表名_set】 如: obj.表名_set.all() 57 related_query_name=None, # 反向操做時,使用的鏈接前綴,用於替換【表名】 如: models.UserGroup.objects.filter(表名__字段名=1).values('表名__字段名') 58 limit_choices_to=None, # 在Admin或ModelForm中顯示關聯數據時,提供的條件: 59 # 如: 60 - limit_choices_to={'nid__gt': 5} 61 - limit_choices_to=lambda : {'nid__gt': 5} 62 63 from django.db.models import Q 64 - limit_choices_to=Q(nid__gt=10) 65 - limit_choices_to=Q(nid=8) | Q(nid__gt=10) 66 - limit_choices_to=lambda : Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') 67 symmetrical=None, # 僅用於多對多自關聯時,symmetrical用於指定內部是否建立反向操做的字段 68 # 作以下操做時,不一樣的symmetrical會有不一樣的可選字段 69 models.BB.objects.filter(...) 70 71 # 可選字段有:code, id, m1 72 class BB(models.Model): 73 74 code = models.CharField(max_length=12) 75 m1 = models.ManyToManyField('self',symmetrical=True) 76 77 # 可選字段有: bb, code, id, m1 78 class BB(models.Model): 79 80 code = models.CharField(max_length=12) 81 m1 = models.ManyToManyField('self',symmetrical=False) 82 83 through=None, # 自定義第三張表時,使用字段用於指定關係表 84 through_fields=None, # 自定義第三張表時,使用字段用於指定關係表中那些字段作多對多關係表 85 from django.db import models 86 87 class Person(models.Model): 88 name = models.CharField(max_length=50) 89 90 class Group(models.Model): 91 name = models.CharField(max_length=128) 92 members = models.ManyToManyField( 93 Person, 94 through='Membership', 95 through_fields=('group', 'person'), 96 ) 97 98 class Membership(models.Model): 99 group = models.ForeignKey(Group, on_delete=models.CASCADE) 100 person = models.ForeignKey(Person, on_delete=models.CASCADE) 101 inviter = models.ForeignKey( 102 Person, 103 on_delete=models.CASCADE, 104 related_name="membership_invites", 105 ) 106 invite_reason = models.CharField(max_length=64) 107 db_constraint=True, # 是否在數據庫中建立外鍵約束 108 db_table=None, # 默認建立第三張表時,數據庫中表的名稱
1 # 增 2 # 3 # models.Tb1.objects.create(c1='xx', c2='oo') 增長一條數據,能夠接受字典類型數據 **kwargs 4 5 # obj = models.Tb1(c1='xx', c2='oo') 6 # obj.save() 7 8 # 查 9 # 10 # models.Tb1.objects.get(id=123) # 獲取單條數據,不存在則報錯(不建議) 11 # models.Tb1.objects.all() # 獲取所有 12 # models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據 13 14 # 刪 15 # 16 # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數據 17 18 # 改 19 # models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數據更新,均支持 **kwargs 20 # obj = models.Tb1.objects.get(id=1) 21 # obj.c1 = '111' 22 # obj.save() # 修改單條數據
1 # 獲取個數 2 # 3 # models.Tb1.objects.filter(name='seven').count() 4 5 # 大於,小於 6 # 7 # models.Tb1.objects.filter(id__gt=1) # 獲取id大於1的值 8 # models.Tb1.objects.filter(id__gte=1) # 獲取id大於等於1的值 9 # models.Tb1.objects.filter(id__lt=10) # 獲取id小於10的值 10 # models.Tb1.objects.filter(id__lte=10) # 獲取id小於10的值 11 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 12 13 # in 14 # 15 # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於十一、2二、33的數據 16 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in 17 18 # isnull 19 # Entry.objects.filter(pub_date__isnull=True) 20 21 # contains 22 # 23 # models.Tb1.objects.filter(name__contains="ven") 24 # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 25 # models.Tb1.objects.exclude(name__icontains="ven") 26 27 # range 28 # 29 # models.Tb1.objects.filter(id__range=[1, 2]) # 範圍bettwen and 30 31 # 其餘相似 32 # 33 # startswith,istartswith, endswith, iendswith, 34 35 # order by 36 # 37 # models.Tb1.objects.filter(name='seven').order_by('id') # asc 38 # models.Tb1.objects.filter(name='seven').order_by('-id') # desc 39 40 # group by 41 # 42 # from django.db.models import Count, Min, Max, Sum 43 # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) 44 # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id" 45 46 # limit 、offset 47 # 48 # models.Tb1.objects.all()[10:20] 49 50 # regex正則匹配,iregex 不區分大小寫 51 # 52 # Entry.objects.get(title__regex=r'^(An?|The) +') 53 # Entry.objects.get(title__iregex=r'^(an?|the) +') 54 55 # date 56 # 57 # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1)) 58 # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1)) 59 60 # year 61 # 62 # Entry.objects.filter(pub_date__year=2005) 63 # Entry.objects.filter(pub_date__year__gte=2005) 64 65 # month 66 # 67 # Entry.objects.filter(pub_date__month=12) 68 # Entry.objects.filter(pub_date__month__gte=6) 69 70 # day 71 # 72 # Entry.objects.filter(pub_date__day=3) 73 # Entry.objects.filter(pub_date__day__gte=3) 74 75 # week_day 76 # 77 # Entry.objects.filter(pub_date__week_day=2) 78 # Entry.objects.filter(pub_date__week_day__gte=2) 79 80 # hour 81 # 82 # Event.objects.filter(timestamp__hour=23) 83 # Event.objects.filter(time__hour=5) 84 # Event.objects.filter(timestamp__hour__gte=12) 85 86 # minute 87 # 88 # Event.objects.filter(timestamp__minute=29) 89 # Event.objects.filter(time__minute=46) 90 # Event.objects.filter(timestamp__minute__gte=29) 91 92 # second 93 # 94 # Event.objects.filter(timestamp__second=31) 95 # Event.objects.filter(time__second=2) 96 # Event.objects.filter(timestamp__second__gte=31)
1 # extra 2 # 3 # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None) 4 # Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,)) 5 # Entry.objects.extra(where=['headline=%s'], params=['Lennon']) 6 # Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"]) 7 # Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid']) 8 9 # F 10 # 11 # from django.db.models import F 12 # models.Tb1.objects.update(num=F('num')+1) 13 14 15 # Q 16 # 17 # 方式一: 18 # Q(nid__gt=10) 19 # Q(nid=8) | Q(nid__gt=10) 20 # Q(Q(nid=8) | Q(nid__gt=10)) & Q(caption='root') 21 # 方式二: 22 # con = Q() 23 # q1 = Q() 24 # q1.connector = 'OR' 25 # q1.children.append(('id', 1)) 26 # q1.children.append(('id', 10)) 27 # q1.children.append(('id', 9)) 28 # q2 = Q() 29 # q2.connector = 'OR' 30 # q2.children.append(('c1', 1)) 31 # q2.children.append(('c1', 10)) 32 # q2.children.append(('c1', 9)) 33 # con.add(q1, 'AND') 34 # con.add(q2, 'AND') 35 # 36 # models.Tb1.objects.filter(con) 37 38 39 # 執行原生SQL 40 # 41 # from django.db import connection, connections 42 # cursor = connection.cursor() # cursor = connections['default'].cursor() 43 # cursor.execute("""SELECT * from auth_user where id = %s""", [1]) 44 # row = cursor.fetchone()
原始sql數據庫
cursor = connection.cursor() cursor.execute('''SELECT DISTINCT first_name ROM people_person WHERE last_name = %s""", ['Lennon']) row = cursor.fetchone()
點與雙下劃線的做用django
1 from django.db import models 2 3 4 class Project(models.Model): 5 name = models.CharField(max_length=32, blank=True) 6 id = models.CharField(max_length=32, unique=True, primary_key=True, blank=True) 7 create_date = models.DateTimeField(auto_now_add=True) 8 update_date = models.DateTimeField(auto_now=True) 9 10 def __str__(self): 11 return self.name 12 13 14 class Uhost(models.Model): 15 name = models.CharField(max_length=32, blank=True) 16 id = models.CharField(max_length=32, blank=False, primary_key=True) 17 ip = models.GenericIPAddressField(blank=True, null=True) 18 project = models.ForeignKey(Project, verbose_name=u'所屬項目', db_constraint=False, on_delete=models.DO_NOTHING, blank=True) 19 create_date = models.DateTimeField(u'建立時間', auto_now_add=True) 20 update_date = models.DateTimeField(u'更新時間', auto_now=True) 21 22 def __str__(self): 23 return self.name
object對象:對象獲取某一列值(或者說是獲取某個屬性)的時候,使用點來獲取。跨表查詢時,也是使用點來獲取。json
一個object對象就是表中的一條數據,表中全部的字段它都有。例如我取Uhost表中的第一個對象 >>> host = Uhost.objects.all()[0] >>> print type(host) <class 'ucloud.models.Uhost'> 對象獲取某個值使用「.」 >>> host.id u'uhost-3th2rp' >>> host.ip u'10.6.13.253' >>> host.project <Project: CPMS10> 注意:Uhost表中project字段是一個ForeighKey,當獲取host.project時,獲取到的結果是一個對象 咱們還能夠獲取這個對象其餘值,好比Project表中定義了name、id、create_time、update_time四個字段,咱們能夠經過下面的方式獲取 >>> host.project.name u'CPMS10' >>> host.project.id u'org-81' >>> host.project.create_date datetime.datetime(2017, 3, 6, 12, 21, 7, 296546) >>> host.project.update_date datetime.datetime(2017, 5, 19, 16, 19, 8, 925978)
>>> host.project_id u'org-81' >>> host.project_name Traceback (most recent call last): File "<console>", line 1, in <module> AttributeError: 'Uhost' object has no attribute 'project_name' 這裏咱們之因此能獲取到project_id這個字段的值是由於,在Uhost表中project字段是ForeignKey,而在數據庫中被設置了外鍵的列,在數據庫中的字段名就是本表中的列名 +「_「」+被設置外鍵的表的那個字段名,而Project表中id是primary_key,因此id列被設置了外鍵 。 由上可知,host.project.id是跨表查詢,而host.project_id並非跨表查詢。由於這個字段在本身表中。
QuerySet查詢集:查詢集是一組數據的集合,跟python的list基本同樣的。查詢集作跨表查詢時,使用雙下劃線"__"。app
>>> host2 = Uhost.objects.all().values('ip','name') >>> print type(host2) <class 'django.db.models.query.ValuesQuerySet'> [{'ip': u'10.6.13.253', 'name': u'dbbackupsyncer2'}, {'ip': u'10.6.30.43', 'name': u'SRV-CPMS10-WEB16'}, {'ip': u'10.6.20.189', 'name': u'SRV-CPMS10-WEB15'}, {'ip': u'10.6.14.232', 'name': u'publicconsole'}, {'ip': u'10.6.10.236', 'name': u'SRV-CPMS10-WEB14'}, {'ip': u'10.6.10.159', 'name': u'dbbackupsyncer'}, {'ip': u'10.6.11.73', 'name': u'\u5b98\u7f51'}, {'ip': u'10.6.7.170', 'name': u'99exchangedb'}, {'ip': u'10.6.5.22', 'name': u'dc1'}, {'ip': u'10.6.3.243', 'name': u'dc2'}, {'ip': u'10.6.2.213', 'name': u'publicweb'}, {'ip': u'10.6.8.163', 'name': u'SRV-CPMS10-WEB13'}, {'ip': u'10.10.16.165', 'name': u'SRV-OTA10-WS04'}, {'ip': u'10.10.31.79', 'name': u'SRV-OTA10-WS05'}, {'ip': u'10.10.187.86', 'name': u'SRV-OTA10-WS03'}, {'ip': u'10.10.102.32', 'name': u'SRV-OTA10-WEB04'}, {'ip': u'10.10.107.144', 'name': u'SRV-OTA10-WEB03'}, {'ip': u'10.10.112.46', 'name': u'99datasyncer'}, {'ip': u'10.10.48.121', 'name': u'SRV-CPMS10-WEB31'}, {'ip': u'10.10.218.108', 'name': u'SRV-CPMS10-WEB30'}, '...(remaining elements truncated)...'] 咱們知道對象跨表查詢能夠用點,QuerySet可使用雙下劃線「__」,例如獲取Uhost表中全部對象的project id 和project name,能夠這樣作: >>> host2 = Uhost.objects.all().values('ip','name','project__id','project__name') >>> host2[0] {'ip': u'10.6.13.253', 'project__name': u'CPMS10', 'name': u'dbbackupsyncer2', 'project__id': u'org-81'}
數據庫連表操做
一對多:
user_info_obj = models.UserInfo.objects.filter(id=1).first() print user_info_obj.user_type print user_info_obj.get_user_type_display() print user_info_obj.userprofile.password user_info_obj = models.UserInfo.objects.filter(id=1).values('email', 'userprofile__username').first() print user_info_obj.keys() print user_info_obj.values()
多對多:
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')
注意:xx_set中的【_set】是固定搭配,利用雙下劃線和 _set 將表之間的操做鏈接起來