まず、長所と短所に、多くのクエリ
クラスクラス(models.Model): 名前 = models.CharField(max_lengthを= 32、verbose_name = " 班级名" ) のコース = models.CharField(verbose_name = " 课程"、MAX_LENGTH = 32 ) デフ __str__ (自己): 戻り値の自己。名前の クラスの先生(models.Model): 名前 = models.CharField(max_lengthを= 23、verbose_name = " 姓名" ) クラス =モデル。ManyToManyField(verbose_name = " 所属班级" =に、" クラス" ) DEF __str__ (自己): 戻り self.name
トピック1:クラスの先生を探すには、ナナをもたらしました
#1 ウェイ:オブジェクトベースのルックアップ OBJ = models.Teacher.objects.filter(名前= " ナナ" )1次回() 印刷(obj.classes.all()) を印刷(" クラスとナナの先生"、 obj.classes.values(" 名前" )) #第二の方法:二重下線の検索に基づいて obj_cls = models.Teacher.objects.filter(名前= " ナナ").values(" classes__name " ) を印刷(" ナナ先生クラスで")、obj_cls
注意:.ALLは,, .valuesまたはvalues_listで、obj.classes.name使用していないときに注意することは、同様のルックアップを逆に、これはなしで発見される,, 1つのチェックで多くのクエリに多くのです。私はちょうどそのようなミスを犯し、教訓を学びます。。
概要:クエリであった場合に、多くの、または多くの多くは、複数の当事者が(すべてを使用する必要があるかどうか)
スクリーンショット業績:
テーブル構造:
django.db インポートモデル #。ここにあなたのモデルを作成します壁紙 #生徒がクラスを持っている、クラスは生徒の多くを持つことができ、それがある #マルチパーティの-to-多くの関係、関連するフィールド クラスの学生(models.Model): 名前 = models.CharField(= MAX_LENGTH 32、verbose_name = " 名前" ) 年齢 = models.IntegerField(verbose_name = " 年齢" ) クラス = models.ForeignKey(=に" クラス"、verbose_name = " クラス" ) DEF __str__ (自己): 戻りself.name クラスクラス(models.Model): 名前 = models.CharField(max_lengthを= 32、verbose_name = " 班级名" ) のコース = models.CharField(verbose_name = " 课程"、MAX_LENGTH = 32 ) デフ __str__ (自己): 戻り値の自己。名前の クラスの先生(models.Model): 名前 = models.CharField(max_lengthを= 23、verbose_name = " 姓名" ) クラス = models.ManyToManyField(verbose_name = " 所属班级" =に、" クラス" ) デフ __str__ (自己): 戻り self.name
2、クラスのクエリフルマカモメ
#ウェイ: 印刷(" クラスツバメ"、models.Student.objects.filter(名前= " ツバメ").values(" classes__name " )) #第二の方法: obj_cls = models.Student.objects.filter(名= " スワロー" )1次回() プリント(" クラスくん"、obj_cls.classes.name)
3、クエリツバメのクラスの先生の名前
印刷(" ツバメクラスどこ教師の名前"、models.Student.objects.filter(名前= " ツバメ").values(" classes__teacher__name "))
4、151クラスの名前ですべての学生をテストするクエリソフトウェア
印刷は、(" すべての学生をテストするソフトウェアの151クラスに名前を付ける"、models.Class.objects.filter(名前= " ソフトウェアテスト151 ").values(" student__name " )) OBJ = models.Class.objects.filter(名= 「ソフトウェアテスト151 」)1次回() #のような印刷の印刷(「名すべての学生をテストするソフトウェアの151クラス」、obj.student_set.name)#結果はなしで 印刷する(「151名のクラスのすべての生徒をテストするためのソフトウェア"obj.student_set.all()。値(" 名前"))
第二に、必要性は非常に重要なポイントの知識を持っています
ボタンタイプを追加するために覚えていれば1、形はそうでない場合は、ボタンがデフォルトのタイプが提出され、影響を受けるだろう、フォーム送信を使用します
<ボタンクラス= "ログイン" タイプ= "ボタン" >注册</ボタン>
< ボタンタイプ= "ボタン" のonclick = "doValidation();" >送信</ ボタン> < INPUTのタイプ= "ボタン" のonclick = "doValidation();" 値= "送信" /> 上記の二つの方法であります、同じように機能します。 < ボタンのonclick =「doValidation();」>提出する</ ボタン> あなたが提出する、この、デフォルトを書く場合、機能を提出するdoValidation方法があったであろう、 機能ボタンが提出されると相まって、それは二回提出されます。そのため、最適なタイプの型を指定するためのボタンを使用している場合。
まず、長所と短所に、多くのクエリ
class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.Model): name = models.CharField(max_length=23,verbose_name="姓名") classes = models.ManyToManyField(verbose_name="所属班级",to="Class") def __str__(self): return self.name
题目1:查找娜娜老师所带的班级
# 方式一:基于对象的查找 obj = models.Teacher.objects.filter(name="娜娜").first() print(obj.classes.all()) print("娜娜老师带的班级",obj.classes.values("name")) # 方式二:基于双下划线的查找 obj_cls = models.Teacher.objects.filter(name="娜娜").values("classes__name") print("娜娜老师带的班级",obj_cls)
注意:要说明的是多对多的查询用.all,,查单个的时候用.values或者values_list,不要用obj.classes.name,,这样查到的会是None,反向查询也是如此。我就是犯了这样的错,引以为戒。。
总结:不管是一对多,还是多对多,要是查询多得一方就得用all()
运行结果截图:
表结构:
from django.db import models # Create your models here. # 一个学生有一个班级,一个班级可以有好多学生,所以是 # 一对多的关系,关联字段放在多的一方 class Student(models.Model): name = models.CharField(max_length=32,verbose_name="姓名") age = models.IntegerField(verbose_name="年龄") classes = models.ForeignKey(to="Class",verbose_name="所属班级") def __str__(self): return self.name class Class(models.Model): name = models.CharField(max_length=32,verbose_name="班级名") course = models.CharField(verbose_name="课程",max_length=32) def __str__(self): return self.name class Teacher(models.Model): name = models.CharField(max_length=23,verbose_name="姓名") classes = models.ManyToManyField(verbose_name="所属班级",to="Class") def __str__(self): return self.name
2、查询海燕在那个班级
# 方式一: print("海燕所在的班级",models.Student.objects.filter(name="海燕").values("classes__name")) # 方式二: obj_cls = models.Student.objects.filter(name="海燕").first() print("海燕所在的班级",obj_cls.classes.name)
3、查询海燕所在班的老师的姓名
print("海燕所在班的老师的姓名",models.Student.objects.filter(name="海燕").values("classes__teacher__name"))
4、查询软件测试151班的所有学生的姓名
print("软件测试151班的所有学生的姓名",models.Class.objects.filter(name="软件测试151").values("student__name")) obj = models.Class.objects.filter(name="软件测试151").first() # print("软件测试151班的所有学生的姓名",obj.student_set.name) #这样打印的结果是None print("软件测试151班的所有学生的姓名",obj.student_set.all().values("name"))
二、需要掌握的一个很重要的知识点
1、form表单中要用submit,如果用button切记要加上type,不然button默认的type是submit,会有影响
<ボタンクラス= "ログイン" タイプ= "ボタン" >注册</ボタン>
< ボタンタイプ= "ボタン" のonclick = "doValidation();" >送信</ ボタン> < INPUTのタイプ= "ボタン" のonclick = "doValidation();" 値= "送信" /> 上記の二つの方法であります、同じように機能します。 < ボタンのonclick =「doValidation();」>提出する</ ボタン> あなたが提出する、この、デフォルトを書く場合、機能を提出するdoValidation方法があったであろう、 機能ボタンが提出されると相まって、それは二回提出されます。そのため、最適なタイプの型を指定するためのボタンを使用している場合。