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

2021-09-07 15:49:33 字數 3819 閱讀 3918

一、多對多的正反向查詢

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,會有影響

type="button">註冊

<

button

type

="button"

onclick

="dovalidation();"

>提交

button

>

<

input

type

="button"

onclick

="dovalidation();"

value

="提交"

/>

上面兩種寫法是對的,功能一樣。

<

button

onclick

="dovalidation();"

>提交

button

>

如果寫成這種,預設為submit,本來dovalidation方法裡有提交功能了,

再加上按鈕也是提交功能,會提交兩次。所以使用按鈕時最好指定type型別。

Linux一點小知識

ps o pid,pgid,ppid,comm cat pid pgid ppid command 17906 17906 17905 bash 18011 18011 17906 ps 18012 18011 17906 cat 1.程序組 pid為程序自身的id,pgid為程序所在的程序組的id...

volatile的一點小知識

volatile是輕量級的synchronized。彙編指令中會加入lock字首避免指令重排並把寫緩衝區的所有資料重新整理到記憶體中保證可見性,但不保證原子性。記憶體屏障 一組處理器指令,實現對記憶體操作的順序限制。有volatile修飾的變數,在進行寫操作時,會發生兩件事 lock字首指令會引起處...

DNS Client 的一點小知識

因為dns是c s結構,大家又熟悉dns server這個概念,所以很容易產生乙個誤解,認為 dns client服務 就是dns的客戶端。誤以為如果禁用 dns client服務 客戶端就不能解析網域名稱了。產生誤解的原因,還在於微軟的誤導。在windows的服務管理中,微軟聲稱 dns clie...