1. 程式人生 > >Django學習【第5篇】:Django之ORM數據庫操作註意細節

Django學習【第5篇】:Django之ORM數據庫操作註意細節

type 打印 print htm lis title none post cls

自己沒有記住的一點小知識(ORM查詢相關)

一、多對多的正反向查詢

技術分享圖片
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,會有影響

  <button class="login" type="button">註冊</button>

技術分享圖片
<button type="button" onclick="doValidation();">提交</button>
<input type="button" onclick="doValidation();" value="提交"/>
上面兩種寫法是對的,功能一樣。

<button onclick="doValidation();">提交</button>
如果寫成這種,默認為submit,本來doValidation方法裏有提交功能了,
再加上按鈕也是提交功能,會提交兩次。所以使用按鈕時最好指定type類型。
技術分享圖片

Django學習【第5篇】:Django之ORM數據庫操作註意細節