Django學習系列之ORM-QuerySetAPI


基本操作

 #
  
 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 表名 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM