1. 程式人生 > >django知識之ORM查詢

django知識之ORM查詢

知識 mod rim desc not tinc index 日期 統計

1. ORM字段

1. AutoField(primary_key=True) -------->自增且主鍵
2. CharField(max_length=16) --------->varchar類型(char類型可以自定義 類改寫db_type
3. IntegerField(null=True) --> 最大10位 -------->int類型(最大10位所以手機號碼一般用char或者varchar類型)
4. DateField(auto_now_add=True)/DatetimeField(auto_now=True) ------->相當於(date:年月日,datetime:年月日 小時分鐘秒)

    配置auto_now_add=True,創建數據記錄的時候會把當前時間添加到數據庫;

    配置上auto_now=True,每次更新數據記錄的時候會更新該字段
5. EmailField()
6. TextField()
7. BooleanField() ------結果是布爾值
8. DecimalField --DecimalField(max_digits =5,decimal_places =2[,**選項]) ----進度是5,其中小數位是2

2. 字段參數

1. null=True --> 可以為空
2. default=100 --> 默認值
3. unique=True --> 唯一
4. db_index=True --> 建立索引


3. 關系字段

1. ForeignKey() --> 外鍵關聯
2. OneToOneField() --> 一對一關聯
3. ManyToManyField() --> 多對多

字段參數:
1. to=‘類名‘
2. to_field=‘屬性名‘

4. 必知必會13條

1. 返回QuerySet:

1. all()
2. filter()
3. exclude()
4. order_by()
5. reverse()
6. distinct()

7. values() --> 字典的列表


8. values_list() --> 元組的列表

2. 返回具體對象:

1. get()
2. first()
3. last()

3. 返回數字:

1. count()

4. 返回布爾值

1. exists()

5.django中運行測試腳本

在app項目下的test.py裏面寫入一下代碼即可

import os

if __name__ == __main__:
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings")
    import django
    django.setup()

    # ORM查詢操作
    from app01 import models      #用app01為例
    
    。。。。。測試內容。。。。

5.ORM連表查詢

技術分享圖片
  1 import os
  2 
  3 if __name__ == __main__:
  4     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "orm_demo.settings")
  5     import django
  6     django.setup()
  7 
  8     # ORM查詢操作
  9     from app01 import models
 10 
 11     # 1. 查找所有書名裏包含番茄的書
 12     # ret = models.Book.objects.filter(title__contains=‘番茄‘)
 13     # print(ret)
 14     # 2. 查找出版日期是2017年的書
 15     # ret = models.Book.objects.filter(publish_date__year=2017)
 16     # print(ret)
 17     # 3. 查找出版日期是2017年的書名
 18     # ret = models.Book.objects.filter(publish_date__year=2017).values("title")
 19     # print(ret)
 20 
 21     # 查找價格大於10元的書
 22     # ret = models.Book.objects.filter(price__gt=10)
 23     # print(ret)
 24 
 25     # 查找價格大於10元的書名和價格
 26     # ret = models.Book.objects.filter(price__gt=10).values("title", "price")
 27     # print(ret)
 28     # 查找memo字段是空的書
 29     # ret = models.Book.objects.filter(memo__isnull=True)
 30     # print(ret)
 31 
 32     # 查找在北京的出版社
 33     # ret = models.Publisher.objects.filter(city=‘北京‘)
 34     # print(ret)
 35 
 36     # 查找名字以沙河開頭的出版社
 37     # ret = models.Publisher.objects.filter(name__startswith="沙河")
 38     # print(ret)
 39 
 40     # 查找作者名字裏面帶‘小‘字的作者
 41     # ret = models.Author.objects.filter(name__contains=‘小‘)
 42     # print(ret)
 43 
 44     # 查找年齡大於30歲的作者
 45     # ret = models.Author.objects.filter(age__gt=30)
 46     # print(ret)
 47 
 48     # 查找手機號是155開頭的作者
 49     # ret = models.Author.objects.filter(phone__startswith=‘155‘)
 50     # print(ret)
 51 
 52     # 查找手機號是155開頭的作者的姓名和年齡
 53     # ret = models.Author.objects.filter(phone__startswith=‘155‘).values("name", "age")
 54     # print(ret)
 55 
 56     # 連表查詢
 57     # book_obj = models.Book.objects.first()
 58     # 基於對象查找
 59     # ret = book_obj.publisher.name
 60     # print(ret)
 61     # 基於雙下劃線的跨表查詢
 62     # ret = models.Book.objects.values("publisher__name", "publisher__city").first()
 63     # print(ret)
 64 
 65     # 正向查找
 66     # 查找書名是“番茄物語”的書的出版社
 67     # 1. 基於對象的查找方式
 68     # ret = models.Book.objects.get(title="番茄物語").publisher
 69     # print(ret)
 70     # 查找書名是“番茄物語”的書的出版社所在的城市
 71     # ret = models.Book.objects.get(title="番茄物語").publisher.city
 72     # print(ret)
 73     # 2. 基於雙下劃線的誇表查詢
 74     # ret = models.Book.objects.filter(title="番茄物語").values("publisher__city")
 75     # print(ret)
 76 
 77     # 外鍵的反向查找
 78     # 1. 基於對象的查找方式
 79     # publisher_obj = models.Publisher.objects.first()
 80     # ret = publisher_obj.book_set.all()
 81     # print(ret)
 82     # 如果設置了 related_name="books"
 83     # publisher_obj = models.Publisher.objects.first()
 84     # ret = publisher_obj.books.all()
 85     # print(ret)
 86 
 87     # 基於雙下劃線的跨表查詢
 88     # ret = models.Publisher.objects.filter(id=1).values("books__title")
 89     # print(ret)
 90 
 91     # 如果設置了 related_query_name="zhangzhao"
 92     # ret = models.Publisher.objects.filter(id=1).values("zhangzhao__title")
 93     # print(ret)
 94 
 95 
 96     # 多對多操作
 97     # 1. create
 98     # 做了兩件事情:
 99     # 1. 創建了一個新的作者,2. 將新創建的作者和第一本書做關聯
100     # ret = models.Book.objects.first().author.create(
101     #     name="張曌",
102     #     age=16,
103     #     phone="18012575998",
104     #     detail_id=4
105     # )
106     # ret = models.Book.objects.first().author.all().values("id")
107     # print(ret)
108 
109 
110     # 2. set
111     # models.Book.objects.first().author.set([2,3])
112     # ret = models.Book.objects.first().author.all().values("id")
113     # print(ret)
114 
115     # 3. add
116     # models.Book.objects.first().author.add(1)
117 
118     # ret = models.Book.objects.first().author.all().values("id")
119     # print(ret)
120 
121     # 4. remove
122     # models.Book.objects.first().author.remove(3)
123 
124     # ret = models.Book.objects.first().author.all().values("id")
125     # print(ret)
126 
127     # 5.clear
128     # models.Book.objects.first().author.clear()
129     #
130     # ret = models.Book.objects.first().author.all().values("id")
131     # print(ret)
132 
133     # 6. all
134     # ret = models.Book.objects.first().author.all()
135     # print(ret)
136 
137     # 聚合
138     # 查詢所有書的總價格
139     from django.db.models import Avg, Sum, Max, Min, Count
140     #
141     # ret = models.Book.objects.aggregate(total_price=Sum("price"))
142     # print(ret)
143     #
144     # ret = models.Book.objects.aggregate(avg_price=Avg("price"), max_price=Max("price"), min_price=Min("price"))
145     # print(ret)
146 
147 
148     # 求每一本書的作者個數
149     # ret = models.Book.objects.annotate(c=Count("author")).values("title", "c")
150     # print(ret)
151 
152 
153     # 統計出每個出版社買的最便宜的書的價格
154     # ret = models.Publisher.objects.annotate(min_price=Min("books__price")).values("name", "min_price")
155     # print(ret)
156 
157     # 統計不止一個作者的圖書 (書作者的數量大於1)
158     # ret = models.Book.objects.annotate(c=Count("author")).filter(c__gt=1)
159     # print(ret)
160 
161     # 按照書作者的數量做排序
162     # ret = models.Book.objects.annotate(c=Count("author")).order_by("c")
163     # print(ret)
164 
165     # 查詢各個作者出的書的總價格
166 
167     # ret = models.Author.objects.annotate(sum_price=Sum("book__price")).values("name", "sum_price")
168     # print(ret)
orm連表查詢實例測試

django知識之ORM查詢