# 第十一節:ORM作業參考答案
# ORM作業參考答案:
1. 查詢平均成績大于60分的同學的id和平均成績;
```
<pre class="calibre12">```
rows = Student.objects.annotate(avg=Avg(<span class="hljs-string">"score__number"</span>)).filter(avg__gte=<span class="hljs-params">60</span>).values(<span class="hljs-string">"id"</span>,<span class="hljs-string">"avg"</span>)
<span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows:
print(row)
```
```
2. 查詢所有同學的id、姓名、選課的數、總成績;
```
<pre class="calibre12">```
rows = Student.objects.annotate(course_nums=Count(<span class="hljs-string">"score__course"</span>),total_score=Sum(<span class="hljs-string">"score__number"</span>))
.values(<span class="hljs-string">"id"</span>,<span class="hljs-string">"name"</span>,<span class="hljs-string">"course_nums"</span>,<span class="hljs-string">"total_score"</span>)
<span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows:
print(row)
```
```
3. 查詢姓“李”的老師的個數;
```
<pre class="calibre12">```
teacher_nums = Teacher.objects.filter(name__startswith=<span class="hljs-string">"李"</span>).count()
print(teacher_nums)
```
```
4. 查詢沒學過“黃老師”課的同學的id、姓名;
```
<pre class="calibre12">```
rows = Student.objects.exclude(score__course__teacher__name=<span class="hljs-string">"黃老師"</span>).values(<span class="hljs-string">'id'</span>,<span class="hljs-string">'name'</span>)
<span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows:
print(row)
```
```
5. 查詢學過課程id為1和2的所有同學的id、姓名;
```
<pre class="calibre12">```
rows = Student.objects.filter(score__course__in=[<span class="hljs-params">1</span>,<span class="hljs-params">2</span>]).distinct().values(<span class="hljs-string">'id'</span>,<span class="hljs-string">'name'</span>)
<span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows:
print(row)
```
```
6. 查詢學過“黃老師”所教的所有課的同學的學號、姓名;
```
<pre class="calibre12">```
rows = Student.objects.annotate(nums=Count(<span class="hljs-string">"score__course"</span>,filter=Q(score__course__teacher__name=<span class="hljs-string">'黃老師'</span>)))
.filter(nums=Course.objects.filter(teacher__name=<span class="hljs-string">'黃老師'</span>).count()).values(<span class="hljs-string">'id'</span>,<span class="hljs-string">'name'</span>)
<span class="hljs-keyword">for</span> row <span class="hljs-keyword">in</span> rows:
print(row)
```
```
7. 查詢所有課程成績小于60分的同學的id和姓名;
```
<pre class="calibre12">```
students = Student.objects.exclude(score__number__gt=<span class="hljs-params">60</span>)
<span class="hljs-keyword">for</span> student <span class="hljs-keyword">in</span> students:
print(student)
```
```
8. 查詢沒有學全所有課的同學的id、姓名;
```
<pre class="calibre12">```
students = Student.objects.annotate(num=Count(F(<span class="hljs-string">"score__course"</span>))).filter(num__lt=Course.objects.count()).values(<span class="hljs-string">'id'</span>,<span class="hljs-string">'name'</span>)
<span class="hljs-keyword">for</span> student <span class="hljs-keyword">in</span> students:
print(student)
```
```
9. 查詢所有學生的姓名、平均分,并且按照平均分從高到低排序;
```
<pre class="calibre12">```
students = Student.objects.annotate(avg=Avg(<span class="hljs-string">"score__number"</span>)).order_by(<span class="hljs-string">"-avg"</span>).values(<span class="hljs-string">'name'</span>,<span class="hljs-string">'avg'</span>)
<span class="hljs-keyword">for</span> student <span class="hljs-keyword">in</span> students:
print(student)
```
```
10. 查詢各科成績的最高和最低分,以如下形式顯示:課程ID,課程名稱,最高分,最低分:
```
<pre class="calibre12">```
courses = Course.objects.annotate(min=Min(<span class="hljs-string">"score__number"</span>),max=Max(<span class="hljs-string">"score__number"</span>)).values(<span class="hljs-string">"id"</span>,<span class="hljs-string">'name'</span>,<span class="hljs-string">'min'</span>,<span class="hljs-string">'max'</span>)
<span class="hljs-keyword">for</span> course <span class="hljs-keyword">in</span> courses:
print(course)
```
```
11. 查詢每門課程的平均成績,按照平均成績進行排序;
```
<pre class="calibre12">```
courses = Course.objects.annotate(avg=Avg("score__number")).order_by('avg').values('id','name','avg')
for course in courses:
print(course)
```
```
12. 統計總共有多少女生,多少男生;
```
<pre class="calibre12">```
rows = Student.objects.aggregate(male_num=Count(<span class="hljs-string">"gender"</span>,filter=Q(gender=<span class="hljs-params">1</span>)),female_num=Count(<span class="hljs-string">"gender"</span>,filter=Q(gender=<span class="hljs-params">2</span>)))
print(rows)
```
```
13. 將“黃老師”的每一門課程都在原來的基礎之上加5分;
```
<pre class="calibre12">```
rows = Score.objects.filter(course__teacher__name=<span class="hljs-string">'黃老師'</span>).update(number=F(<span class="hljs-string">"number"</span>)+<span class="hljs-params">5</span>)
print(rows)
```
```
14. 查詢兩門以上不及格的同學的id、姓名、以及不及格課程數;
```
<pre class="calibre12">```
students = Student.objects.annotate(bad_count=Count(<span class="hljs-string">"score__number"</span>,filter=Q(score__number__lt=<span class="hljs-params">60</span>))).filter(bad_count__gte=<span class="hljs-params">2</span>).values(<span class="hljs-string">'id'</span>,<span class="hljs-string">'name'</span>,<span class="hljs-string">'bad_count'</span>)
<span class="hljs-keyword">for</span> student <span class="hljs-keyword">in</span> students:
print(student)
```
```
15. 查詢每門課的選課人數;
```
<pre class="calibre12">```
courses = Course.objects.annotate(student_nums=Count(<span class="hljs-string">"score__student"</span>)).values(<span class="hljs-string">'id'</span>,<span class="hljs-string">'name'</span>,<span class="hljs-string">'student_nums'</span>)
<span class="hljs-keyword">for</span> course <span class="hljs-keyword">in</span> courses:
print(course)
```
```
- Introduction
- 第一章:學前準備
- 第一節:虛擬環境
- 第二節:準備工作
- 第三節:Django介紹
- 第四節:URL組成部分
- 第二章:URL與視圖
- 第一節:第一個Django項目
- 第二節:視圖與URL分發器
- 第三章:模板
- 第一節:模板介紹
- 第二節:模板變量
- 第三節:常用標簽
- 第四節:常用過濾器
- 第五節:自定義過濾器
- 第七節:模版結構優化
- 第八節:加載靜態文件
- 第四章:數據庫
- 第一節:MySQL相關軟件
- 第二節:數據庫操作
- 第三節:ORM模型
- 第四節:模型常用字段
- 第五節:外鍵和表關系
- 第六節:增刪改查操作
- 第七節:查詢操作
- 第八節:QuerySet API
- 第九節:ORM模型遷移
- 第十節:ORM作業
- 第十一節:ORM作業參考答案
- 第十二節:Pycharm連接數據庫
- 第五章:視圖高級
- 第一節:限制請求method
- 第二節:頁面重定向
- 第三節:HttpRequest對象
- 第四節:HttpResponse對象
- 第五節:生成CSV文件
- 第六節:類視圖
- 第七節:錯誤處理
- 第六章:表單
- 第一節:表單概述
- 第二節:用表單驗證數據
- 第三節:ModelForm
- 第四節:文件上傳
- 第七章:cookie和session
- 第八章:上下文處理器和中間件
- 第一節:上下文處理器
- 第二節:中間件
- 第九章:安全
- 第一節:CSRF攻擊
- 第二節:XSS攻擊
- 第三節:點擊劫持攻擊
- 第四節:SQL注入
- 第十章:信號
- 第一節:什么是信號
- 第十一章:驗證和授權
- 第一節:概述
- 第二節:用戶對象
- 第三節:權限和分組
- 第十二章:Admin系統
- 第十三章:Django的緩存
- 第十四章:memcached
- 第十五章:Redis