ORMは、彼が覚えていなかったことを少し知識関連のサプリメントを照会(ORM関連)

まず、長所と短所に、多くのクエリ

コードをコピー
クラスクラス(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方法があったであろう、
機能ボタンが提出されると相まって、それは二回提出されます。そのため、最適なタイプの型を指定するためのボタンを使用している場合。
コードをコピー

 

おすすめ

転載: www.cnblogs.com/maaosheng/p/11621471.html