Django
使用django.db.models.ForeignKey
定義多對一關系。
ForeignKey
需要一個位置參數:與該模型關聯的類
class Info(models.Model):
user = models.ForeignKey(other_model,on_delete=models.SET_NULL)
生活中的多對一關系:班主任,班級關系。一個班主任可以帶很多班級,但是每個班級只能有一個班主任
from django.db import models
# id name gender 定義老師的模型類
class Teacher(models.Model):
name = models.CharField(max_length=30,verbose_name="老師姓名")
gender = models.CharField(max_length=10,verbose_name="老師性別")
class Meta:
db_table = "teachers"
def __str__(self):
return self.name
# id name gender score teacher_id
class Student(models.Model):
name = models.CharField(max_length=20,verbose_name="學生姓名")
gender = models.CharField(max_length=10,verbose_name="學生性別")
score = models.IntegerField(verbose_name="學生分數")
# to:後邊寫所關聯的模型類
# on_delete=models.CASCADE:主表中數據刪除,從表也刪除
# 外鍵關聯的是整個模型類,不是單獨的某一個對象
# 但是通過模型類會產生一個相關聯的字段 字段名_id
teacher = models.ForeignKey(to=Teacher,on_delete=models.CASCADE,verbose_name="所屬老師")
class Meta:
db_table = "students"
def __str__(self):
return self.name
添加老師語法:
模型類.objects.create()
Teacher.objects.create(name="王老師",gender="女")
刪除老師語法:
模型類.objects.get(條件).delete()
# 刪除id為2的老師
Teacher.objects.get(id=2).delete() # (3, {'myapp.Student': 2, 'myapp.Teacher': 1})
# 3代表一共刪除的數據個數 Student刪除3條 Teacher刪除1
修改老師語法:
模型類.objects.filter(條件).update()
# 修改id為3的老師性別為女
Teacher.objects.filter(id=3).update(gender="女")
以上創建了兩條老師數據 由於我們設置外鍵關聯可以為空null=True
,所以此時在班級表創建時,可以直接保存,不需要提供老師數據
添加學生語法:
模型類.objects.create()
通過外鍵_id的形式來添加
Student.objects.create(name="李四",gender="男",score=80,teacher_id=3)
直接給外鍵賦值一個老師對象
t1 = Teacher.objects.create(name="李老師",gender="男")
Student.objects.create(name="李四",gender="男",score=80,teacher=t1)
刪除學生語法:
模型類.objects.get(條件).delete()
Student.objects.get(id=1).delete()
修改學生語法:
模型類.objects.filter(條件).update(字段1,字段2...)
Student.objects.get(id=1).update(name="張三")
注意:要記得刪除之後要重新獲取一次數據,否則查看到的結果中還是之前獲取到的有老師的班級數據
將老師分配個班級之後,由於班級表關聯了老師字段,我們可以通過班級找到對應老師 雖然老師表中沒有關聯班級字段,
但是也可以通過老師找到他所帶的班級,這種查詢方式也叫作關聯查詢
# 查詢id為2的學生的老師姓名
--找到id為2的學生
stu = Student.objects.get(id=2)
--找到stu對應的老師 stu.teacher.name
stu.外鍵.name
通過模型類名稱後追加一個_set
,來實現反向查詢
反向查詢:通過django的內置屬性來進行查詢 模型類(模型類小寫)_set()可以反向查詢老師名下的所有學生,
# 查詢id為1的老師的所有學生 --先找到id為1的老師
tea = Teacher.objects.get(id=1)
--查詢tea老師名下的所有學生 老師對象.模型類_set.all()
tea.student_set.all()