ジャンゴ-ORMテーブルの宿題


DjangoのORM-演習https://www.cnblogs.com/Michael--chen/protected/articles/10926556.html
DjangoのORM-

A.表の構造は
  、次の表を作成し、関連する制約を作成します。

 

 

  モデルファイル、モデルクラスコード:

复制代码
クラスクラス(models.Model):
CID = models.AutoField(PRIMARY_KEY =真)
キャプション= models.CharField(max_lengthを= 32)
グレード= models.ForeignKey( "ClassGrade"、on_delete = models.CASCADE)


クラスClassGrade(models.Model):
GID = models.AutoField(PRIMARY_KEY = TRUE)
gnameという= models.CharField(MAX_LENGTH = 32)


クラス学生(models.Model):
SID = models.AutoField(PRIMARY_KEY = TRUE)
SNAME = models.CharField(MAX_LENGTH = 32)
gender_choice =((0、 "女")、(1、 "男"))
性別=モデル.SmallIntegerField(選択肢= gender_choice、デフォルト= 1)
クラス= models.ForeignKey( "クラス"、on_delete = models.CASCADE)


クラスの先生(models.Model):
TID = models.AutoField(PRIMARY_KEY =真)
TNAME = models.CharField(max_lengthを= 32)
クラス= models.ManyToManyField( "クラス")


クラスコース(models.Model):
CID = models.AutoField(PRIMARY_KEY = TRUE)
CNAME = models.CharField(MAX_LENGTH = 32)
教師= models.ForeignKey( "教師"、on_delete = models.CASCADE)


スコアクラス(models.Model):
SID = models.AutoField(PRIMARY_KEY =真)
学生= models.ForeignKey( "学生"、on_delete = models.CASCADE)
コースmodels.ForeignKey =( 'コース、'、on_delete = models.CASCADE)
スコア= models.IntegerField()
コードをコピーする
2つの挿入テストデータ
  1.グレードテーブル(ClassGrade)

INSERT INTO app01_classgrade(GID、gnameという) VALUES(1、 ' グレード');
INSERT INTOのapp01_classgrade(GID、gnameという)VALUES(2、 '第二級')
。INSERT INTOのapp01_classgrade(GID、gnameという)VALUES(3、「3グレード');
INSERT INTOのapp01_classgrade(GID、gnameという)VALUES(4、' 4年生「);
  2.クラステーブル(クラス)

コードをコピー
INSERT INTOは(CID、キャプション、app01_classes grade_id)VALUES(1、 '1 年のクラス'、1);
INSERT INTOは(CID、キャプション、grade_id)VALUES(2、 '2年クラス'、1)app01_classes。
INSERT INTOは(CID、キャプション、app01_classes grade_id)VALUES(3、 '1 クラス年、2);
INSERT INTOのapp01_classes(CID、キャプション、grade_id)VALUES(4 '2年クラス'、2);
INSERT INTO app01_classes(CID、キャプション、grade_id) VALUES(5、 ' 三つのクラス1' ,. 3);
INSERT INTOのapp01_classes(CID、キャプション、grade_id)VALUES(6 '三つのクラス2' ,. 3);
INSERT INTOのapp01_classes( CID、キャプション、grade_id)VALUES( 7 ' クラス3 3'、3);
INSERT INTOのapp01_classes(CID、キャプション、grade_id)VALUES(8 '4つのクラス1'、4);
重複コード
  3.テーブル教師(教師)

app01_teacher INSERT INTO(TID、TNAME) VALUES(1、 ' ビン教師');
app01_teacher INSERT INTO(TID、TNAME)VALUES(2、 '任意優雅')
。INSERT INTO app01_teacher(TID、TNAME)VALUES(3、「任意バンク');
app01_teacher INSERT INTO(TID、TNAME)VALUES(4、'越Buqun ')
。INSERT INTO app01_teacher(TID、TNAME)VALUES(5、'タン「);
  4.カリキュラム(コース)

INSERT INTO app01_course(CID、CNAME、teacher_id)VALUES(1、 '物理'、3);
INSERT INTO app01_course(CID、CNAME、teacher_id)VALUES(2、 '生物'、1);
INSERT INTO app01_course(CID、CNAME、teacher_id)VALUES(3 '语文'、5)。
INSERT INTO app01_course(CID、CNAME、teacher_id)VALUES(4 '数学'、4);
INSERT INTO app01_course(CID、CNAME、teacher_id)VALUES(5、 '日语'、1);
INSERT INTO app01_course(CID、CNAME、teacher_id)VALUES(6 '体育'、2);
  5.学生表(学生)

コードコピー
INSERT INTOのapp01_student(SID、SNAME、 classes_id、性別)VALUES(1、 ' zhangwuji'、2、1);
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(2、 '趙'、1、 0);
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(3 'Linghu' ,. 3 ,. 1);
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(4、 '任意優雅'、4 、0);
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(5、 '牙Shiyu' ,. 5 ,. 1);
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(6 '張'、。 6 ,. 1);
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(7、 "呉" ,. 8 ,. 1);。
。INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(8、 "LU"、 7、1)。
INSERT INTOのapp01_student(SID、SNAME、 classes_id、性別)VALUES(9 ' 蓮' ,. 6、0);
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(10、 '西門'、8、1) ;
INSERT INTOのapp01_student(SID、SNAME、classes_id、性別)VALUES(11、 '林'、7、1);
重複コード
  6クラスオフィステーブル(TeacherClassesテーブル)

复制代码
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(1、1、8)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(2、1、7)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(3、1、6)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(4、2、5)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(5、3、4)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(6,3、5)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(7、4、4)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(8、5、3)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(9、2、2)app01_teacher_classes。
INSERT INTOは、(ID、teacher_id、classes_id)VALUES(10、3、1)app01_teacher_classes。
INSERT INTOはapp01_teacher_classes(ID、teacher_id、classes_id)VALUES(11、4、1);
复制代码
  7。成绩表(音楽)

复制代码
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(1、80、1、2)。
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(2、60、1、3)。
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(3、72、2、1)。
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(4、58、3、1)。
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(5、91、4、5)。
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(6、84、5、5)。
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(7、78、6、8)。
INSERT INTO app01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(8、82、4、7)。
INSERT INTOのapp01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(9、87 ,. 4 ,. 6);
INSERT INTOのapp01_score(SID、スコア、Course_IDに、STUDENT_ID)VALUES(10、57、2、。3である);
INSERT INTOのapp01_score( SID、スコア、Course_IDに、STUDENT_ID)値(11、68 ,. 3、2);
INSERT INTOのapp01_score(SID、スコア、Course_IDに、STUDENT_ID)値(12であり、73は、2 2である)、
重複コード
三クエリ動作
重複コード
#1、試験データ自体を作成し、
#2、学生の問い合わせの総数を、
RES = models.Student.objects.count()
RES = models.Student.objects.aggregate(C =カウント( 'SID'))

#3、クエリ「生物学」講座とidと名前の両方を失敗している「物理的」コース年生;
#のアイデア:学生の生物学的または物理的な成果うち最初のフィルタが60より大きい場合、1よりも統計的に大きいグループに学生に従って、すべてであります学生失敗した
RES = models.Score.objects.filter(course__cname__in = [ '生物学的'、 '物理的な']、score__gt = 60).values ( "student__sid")。注釈(C =カウント( 'student__sid'))。フィルタ(c__gt = 1).values( ' student__sid'、 'student__sname')

#4、各学年のクラスのクエリの数、クラスの数は3つの等級を取り上げ前に、
#のアイデア:各クラスのグレードカウント用グレードのパケットの統計によると、その後、最初の3つの値を取るように下降
RES =モデル.Classes.objects.values( 'grade_id')注釈( C =カウント( 'CID'))ORDER_BY( ' - C').. [0:3]

#5は、学生のIDと名前と成績評価点の平均のクエリ最高成績平均点;
#のアイデア:学生のグループによって、各生徒の成績平均点を取得し、その結果に応じてするには、最初に整理
RES = models.Score。 objects.values( 'STUDENT_ID'、 'student__sname ')注釈(=平均( 'スコア'))ORDER_BYを..( ' - ')[0]

#6、クエリ各学年の生徒数;
#のアイデア:学年別にグループ化され、テーブル全体の学生数に関する統計
RES = models.Classes.objects.values(「grade_id」)注釈(C =「)student__sid」(カウント)。

#7、クエリの各生徒の学校番号、名前、成績評価点の平均;
#のアイデア:学生のグループによって、平均スコアの統計
RES = models.Score.objects.values(「STUDENT_ID」、 「student__sname」)注釈(=。 平均( 'スコア'))

#8、生徒の名前のクエリ学生番号「2」、生徒の成績やカリキュラム最高得点の名前;
#のアイデア:学生アウトPK値フィルタによる最初の、そして、その結果のうち最大値の対象には、並べ替え
のres models.Score.objects.filter =(student__sid = 2).values( 'student__sname'、 'course__cname'、 'スコア')ORDER_BY( ' -スコア')。[0]
RES = models.Score.objects.filter(student__sid = 2).values( 'student__sname' 、 'course__cname')。注釈(M = MAX( 'スコア'))[0]

#9は、クエリ名「任意の」クラスの数をもたらした教師の;
#アイデアは:最初の先生の任期表によると、「任意の」先生は某除外、クラスの数の統計
RES = models.Teacher.objects.filter(tname__startswith = "どんな「).values( 'TNAME') 。注釈(C =カウント( 'クラス'))

#10、クラスの数は、クエリID、およびグレード3グレード名未満である;
#アイデア:成績基に、各学年のクラスの数を得るために、フィルタ条件に
RES = models.Classes.objects.values( ' grade_id '' grade__gname ')。注釈(C =カウント(' CID「))。フィルタ(c__lt = 5)

#11、クエリは、idとnameの2人の教師以上のコースを教えた;
#のアイデア:教師グループによると、コース数の統計はできフィルタリング、教え
、RES = models.Course.objects.values(「teacher_id」を " teacher__tname「)。注釈(C =カウント( "CNAME"))。フィルタ(c__gte = 2)

;#12、クエリは、数「1」コースとコース番号、名前の数「2」の学生を学んだ
学生が1つのまたは2科目を学び、その後、1よりも、両方の大きなを与えるグループに学生をたどるうち、最初のフィルタリング:#アイデアを学生が学んできました。
RES = models.Score.objects.filter(course_id__in = [1 、2])の値( 'STUDENT_ID'、 'student__sname')。注釈(C =カウント( 'STUDENT_ID'))。フィルタ(c__gt = 1)

#13、教師のクラスとid名に育てクエリの数;
#のアイデア:教師グループによる最初の、各クラスの先生によって運ば数の統計は、最初のクラスに持ち込ま数に応じてソート取ります。
。RES = models.Teacher.objects.annotate(C =カウント ( 'クラス'))の値( 'TID'、 'TNAME')ORDER_BY( ' - C')。[0]

#14未満、60ポイントの番号、名称のコース年生のクエリにあります;
#のアイデアは:結果テーブル内のフィルターに学生が60未満のスコアから、あなたが重い行くことができ
RES = models.Score.objects.filterを(score__lt = 60).values( 'STUDENT_ID' 、 'student__sname')。異なります()

#15、男性と女性、逆の順序で配置されているへの問い合わせの数;
#アイデア:性別プレスパケットカウント、および最終的に降順
RES = models.Student.objects.values(「性別」)注釈(C =カウント。 ( 'SID'))ORDER_BY( ' - C')

#16お問い合わせは、各選択科目と対応する番号;
#アイデア:結果表によると、当然に応じてグループ化された、あなたは選択科目の数を数えることができます。
RES = models.Score.objects.values( 'course__cname') 。注釈(C =) 'STUDENT_ID'(カウント)

#17、物理学、生物学のクラスで学生IDと名前在籍しながら、クエリ;
#アイデアを:12で
RES = models.Score.objects.filter(course__cname__in = [ '物理的な'、 'バイオ'])の値(「STUDENT_ID。 '' student__sname ')。注釈 (C =(カウント' STUDENT_ID「))。フィルタ(c__gt = 1)

;#18、検索「3」コース分率が60未満は、米国特許第生徒が降順にスコアによって学習され
、プレス条件を濾別し、学生、およびスコアによって降順に#アイデアを
RES = models.Score.objects.filter(STUDENT_ID = 3 、score__lt = 60).order_by( ' -スコア')の値( 'STUDENT_ID')。

#19、各コース内のクエリ成績平均点、成績平均点に応じて昇順で結果、成績平均点が高い順に、コース数に応じて、同じである;
#のアイデア:コースのパケットに応じて、平均スコアを見つけ、あなたが並べ替え、その後することができます。
RES = models.Score.objects.values( 'course__cname') 。注釈(平均( 'スコア')=)。ORDER_BY( ''、 '-course_id')

#20、最高得点クエリーサブジェクト点と最低点:以下の形式で表示:コースID、最高スコア、最低スコア;
#のアイデア:得点は最高と最低のスコアを計算するためにコースに応じてグループ化された転写産物では、あなたが完全に表示することができます。
RES = models.Score.objects.values( 'course__cname') 。注釈(MAX_NUM = MAX( 'スコア')、MIN_NUM = MIN( 'スコア'))
コードをコピー

 

おすすめ

転載: www.cnblogs.com/zengxiaowen/p/11838746.html