基本操作
# 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一條數據,可以接受字典類型數據 **kwargs obj = models.Tb1(c1='xx', c2='oo') obj.save() dic = {'c1':'xx','c2':'oo'} models.Tb1.objects.create(**dic) #Form的產出結果是一個字典,可以根據這個Form的字典和**直接在數據庫創建數據 # 查 models.Tb1.objects.get(id=123) # 獲取單條數據,不存在則報錯(不建議) models.Tb1.objects.all() # 獲取全部 .first() 取第一條數據 models.Tb1.objects.filter(name='seven') # 獲取指定條件的數據 也可以用**的方式傳參數
models.Tb1.objects.filtet(name__icontains='Searcher') #過濾name字段包含Searcher的值並且不區分大小寫,i是不區分大小寫,contains是包含
models.Tb1.objects.filter(name='server').exclude(age='16') #獲取指定條件的數據,但是排除某個條件(獲取所有name=server的內容,但是排除age=16的)
# 刪 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.order_by('name') #升序
models.Tb1.objects.order_by('-name') #降序
細看從數據庫取出的類型
w = models.Simp.objects.all() print w, type(w) [<Simp: chenc>, <Simp: zan>, <Simp: zhangsan>] <class 'django.db.models.query.QuerySet'> #可以看到,從數據庫取出個數據看起來像包含對象的列表。而實際上整個數據為django中的特殊類型 QuerySet 。
.all() 是取得所有列的數據,可以加 .values() 取出某一列,每一項的值為一個 字典 :
w = models.Simp.objects.all().values('username') print w, type(w) [{'username': u'chenc'}, {'username': u'zan'}, {'username': u'zhangsan'}] <class 'django.db.models.query.QuerySet'>
.values_list(),獲取到的值為一個 元組
w = models.Simp.objects.all().values_list('username') print w, type(w) [(u'chenc',), (u'zan',), (u'zhangsan',)] <class 'django.db.models.query.QuerySet'>
.values_list() 也可以添加多個參數:( 可以配合Form在前端生成動態的select )
w = models.Simp.objects.all().values_list('id', 'username') print w, type(w) [(1, u'chenc'), (2, u'zan'), (3, u'zhangsan')] <class 'django.db.models.query.QuerySet'>
query 可以查看執行的sql語句:
b = models.Simp.objects.all() print b.query SELECT "app01_simp"."id", "app01_simp"."username", "app01_simp"."password" FROM "app01_simp"
利用雙下划線將字段和對應的操作連接起來
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__lt=10) # 獲取id小於10的值 9 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 獲取id大於1 且 小於10的值 10 11 # in 12 # 13 # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 獲取id等於11、22、33的數據 14 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in 15 16 # contains 17 # 18 # models.Tb1.objects.filter(name__contains="ven") 19 # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感 20 # models.Tb1.objects.exclude(name__icontains="ven") 21 22 # range 23 # 24 # models.Tb1.objects.filter(id__range=[1, 2]) # 范圍bettwen and 25 26 # 其他類似 27 # 28 # startswith,istartswith, endswith, iendswith, 29 30 # order by 31 # 32 # models.Tb1.objects.filter(name='seven').order_by('id') # asc 從小到大 33 # models.Tb1.objects.filter(name='seven').order_by('-id') # desc 從大到小 34 35 # limit 、offset 36 # 37 # models.Tb1.objects.all()[10:20] 38 39 # group by 40 from django.db.models import Count, Min, Max, Sum 41 # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num')) 42 # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
多對多關系操作
一、准備
1.創建多對多關系表
model.py
class Aihao(models.Model):
''愛好表'''
name = models.CharField(max_length=122)
person = models.ManyToManyField('Person')
def __str__(self):
return self.name
class Person(models.Model):
''人表'''
name= models.CharField(max_length=122)
def __str__(self):
return self.name
一個人有多個愛好,一個愛好可以被多個人擁有
2.生成數據庫
python3.5 manage.py makemigrations
python3.5 manage.py migrate
3.在數據庫客戶端的展示

-愛好表里有一條數據,id是1

-人表里有一條數據,id是1

-這張表是自動創建的,存儲人和愛好的對應關系,這個表就是把人和愛好關聯起來,可以看到aihao_id就是代表的愛好ID,person_id就是代表的人,就是person為Alex,愛好為吃飯
4.操作
查詢
從人出發獲取愛好
from app01.models import * >>> p = Person.objects.get(id=2) #獲取一個人 的對象 >>> p.aihao.all() #獲取這個人的所有愛好 <QuerySet [<Aihao: 吃飯>, <Aihao: 玩電腦>]>
從愛好出發獲取人
>>> a = Aihao.objects.get(id=3) #獲取一個愛好 的對象 >>> a.person_set.all() #獲取有這個愛好的所有人 <QuerySet [<Person: Alex>]>
刪除
from app01.models import * #刪除和一個人相關的所有愛好 >>> d = Person.objects.get(id=3) #獲取Person表中id=3的人 >>> d.aihao.all() #獲取第三張表中(關系對應表) id=3這個人的愛好 <QuerySet [<Aihao: 吃飯>, <Aihao: 玩電腦>]> >>>d.aihao.clear() #在第三張表(關系對應表)中刪除和id=3這個人關聯的數據 >>> d.aihao.all() #獲取第三張表中 id=3這個人的愛好 <QuerySet [<>]> #現在已經沒了 #刪除和這個愛好相關的所有人 >>> d = Person.objects.get(id=2) #獲取一個人 的對象 >>> d.aihao.clear() #刪除和這個人關聯的所有愛好
注意:
如果多個表(愛好表[relate_name=aihao_person_set],manytomany到person表,興趣表[relate_name=xingqu_person_set],manytomany到person表,)
都manytomany到Person表
那每個表manytomany的字段都得設置relate_name字段
如果想通過愛好表反查或者興趣表反查
比如獲取有這個愛好的所有人[a = aihao.object.get(id=2),a.aihao_person_set.all()]
獲取有這個興趣的所有人 [a = xingqu.object.get(id=2),a.xingqu_person_set.all()]
一對多關系操作
表結構
class User(models.Model):
'''用戶表'''
name = models.CharField(max_length=20)
def __str__(self):
return self.name
class UserType(models.Model):
'''用戶類型表'''
name = models.CharField(max_length=20)
user = models.ForeignKey(User)
在數據庫客戶端查看
User表:

UserType表:

注:user_id字段就是User表的外鍵
表結構(models.py)
class Asset(models.Model): hostname = models.CharField(max_length=64, unique=True) os_type = models.CharField('操作系統類型',max_length=64, blank=True,null=True) os_distribution = models.CharField('發型版本',max_length=64, blank=True,null=True) os_release = models.CharField('操作系統版本',max_length=64, blank=True,null=True) inside_ip = models.GenericIPAddressField('內網IP', blank=True, null=True) outside_ip = models.GenericIPAddressField('外網IP', blank=True, null=True) sn = models.CharField('資產SN號',max_length=128, unique=True) business_unit = models.ForeignKey('BusinessUnit', verbose_name='所屬業務線',null=True, blank=True) admin = models.ForeignKey(UserProfile, verbose_name=u'資產管理員',null=True, blank=True) memo = models.TextField('備注', null=True, blank=True) model = models.CharField('型號',max_length=128,null=True, blank=True ) kernelrelease = models.CharField('內核',max_length=128,null=True, blank=True ) create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) class Meta: verbose_name = '資產' verbose_name_plural = "資產" def __str__(self): return '%s sn:%s' %(self.hostname,self.sn) class RAM(models.Model): ''' 內存條 ''' asset = models.ForeignKey('Asset') #這里asset是Asset表的外鍵,在RAM表中這個字段實際為asset_id,就是Asset表中的id字段(因為Asset表中的id字段是唯一的,所以代表這個RAM屬於這個Asset),可以根據asset_id獲取Asset表中的信息 capacity = models.IntegerField('內存大小(MB)') create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) memo = models.CharField('備注',max_length=128, blank=True,null=True) # auto_create_fields = ['sn','slot','model','capacity'] def __str__(self): return '%s:%s' % (self.asset_id,self.capacity) class Meta: verbose_name = '內存' verbose_name_plural = "內存"
因為是一對多關系,所以一個Asset表對應多個RAM表(一個資產可以有多個內存條),RAM表中asset(asset_id)是Asset表的id,也就是Asset表的外鍵
示例一:獲取某個資產下的所有內存條(根據"一"獲取"多")
代碼: >>> a = Asset.objects.get(id=1) #獲取id=1的資產信息 >>> b = a.ram_set.select_related()) #等同於 a.ram_set_all() ... 結果: <QuerySet [<RAM: 4:1234>, <RAM: 4:2312>]>
示例二:獲取某個資產下的每個內存條的capacity值(根據"一"獲取一個"多"的某個值)
代碼: >>> a = Asset.objects.get(id=1) #獲取id=1的資產信息
>>> b = a.ram_set_all() #獲取id=1資產下的所有內存條信息 >>> for i in b: #循環所有內存條,取出每個內存條的capacity ... print(i.capacity) ... 結果: 1234 2312
示例三:獲取某個內存條屬於哪個資產(根據"多"獲取"一")
代碼 a = RAM.objects.get(id=1) #獲取這個內存條 b = a.asset.name #獲取這個內存條屬於哪個資產,獲取name字段
結果:
172-16-1-213
示例四:在RAM表中獲取屬於Asset表id為10的所有內存條(根據外鍵獲取信息)
all_ram = RAM.objects.filter(asset_id=10) #這就獲取了所有數據asset_id為10的內存條
一對一關系操作
表結構(models.py)
class Asset(models.Model): hostname = models.CharField(max_length=64, unique=True) os_type = models.CharField('操作系統類型',max_length=64, blank=True,null=True) os_distribution = models.CharField('發型版本',max_length=64, blank=True,null=True) os_release = models.CharField('操作系統版本',max_length=64, blank=True,null=True) inside_ip = models.GenericIPAddressField('內網IP', blank=True, null=True) outside_ip = models.GenericIPAddressField('外網IP', blank=True, null=True) sn = models.CharField('資產SN號',max_length=128, unique=True) business_unit = models.ForeignKey('BusinessUnit', verbose_name='所屬業務線',null=True, blank=True) admin = models.ForeignKey(UserProfile, verbose_name=u'資產管理員',null=True, blank=True) memo = models.TextField('備注', null=True, blank=True) model = models.CharField('型號',max_length=128,null=True, blank=True ) kernelrelease = models.CharField('內核',max_length=128,null=True, blank=True ) create_date = models.DateTimeField(blank=True, auto_now_add=True) update_date = models.DateTimeField(blank=True,null=True) class Meta: verbose_name = '資產' verbose_name_plural = "資產" def __str__(self): return '%s sn:%s' %(self.hostname,self.sn) class CPU(models.Model): ''' CPU的基本類型 ''' asset = models.OneToOneField('Asset') cpu_model = models.CharField('CPU型號', max_length=128,blank=True) cpu_count = models.SmallIntegerField('物理cpu個數') cpu_core_count = models.SmallIntegerField('cpu核數') create_date = models.DateTimeField(verbose_name='創建時間',auto_now_add=True) update_date = models.DateTimeField(verbose_name='更新時間',blank=True,null=True) memo = models.TextField('備注', null=True,blank=True) class Meta: verbose_name = 'CPU' verbose_name_plural = "CPU" def __str__(self): return self.cpu_model
因為是一對一關系,所以一個Asset表只能對應一個CPU表
示例一:獲取關聯Asset表的CPU表的cpu_model值和cpu_cont值和cpu_core_count值
代碼: >>> a = models.Asset.objects.all() >>> for i in a: ... print(i.cpu.cpu_model,i.cpu.cpu_count,i.cpu.cpu_core_count) ... 結果 hype -v 2 2
數據庫如果添加字段之后執行makemigrations 表名然后執行migrate 表名
