Tips:ForeignKey 定義在多的一方
OneToOneField 和 ManyToManyField 定義任何一方都可以
一對一
通過拓展表去獲取學生的信息的話,語法如下;
學生拓展表的單條對象.關聯(lián)字段,即可獲取到學生表的數(shù)據(jù)
stu_info=Stuinfo.objects.filter(phone='12123124').first() #擴展表
stu = stu_info.stu #建立連接,拿到學生表對象
注意:通過學生獲取關聯(lián)表的數(shù)據(jù)的話,語法如下:
學生對象.關聯(lián)的表名,即可獲取到關聯(lián)表的數(shù)據(jù)
stu = Student.objects.filter(name='小明').first()
stu_info = stu.stuinfo #建立連接,拿到擴展表對象
models.py
from django.db import models
學生表
class Student(models.Model):
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# auto_now_add創(chuàng)建數(shù)據(jù)時,默認create_time字段為當前時間
create_time = models.DateTimeField(auto_now_add=True, null=True)
# 修改的時間,每次update學生信息時,修改改字段的時間為當前時間
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3,decimal_places=1,null=True)
maths = models.DecimalField(max_digits=3,decimal_places=1,null=True)
class Meta:
# 指定Student模型映射到數(shù)據(jù)庫中,對應的表名
db_table = 'student'
學生信息擴展表
class Stuinfo(models.Model):
phone = models.CharField(max_length=11)
adress = models.CharField(max_length=10)
# OneToOneField相當于 Foreignkey , unique = True
#這里把Stuinfo和Student連接了起來
通過Student.stuinfo拿到擴展表對象 Stuinfo.stu拿到學生表對象
stu = models.OneToOneField(Student)
class Meta:
db_table = 'stu_info'
views.py
通過學生查詢擴展表信息
第一種
stu = Student.objects.filter(name='小明').first() #學生表
stu_info = Stuinfo.objects.filter(stu_id=stu.id).first()#建立連接,拿到擴展表對象
phone = stu_info.phone
第二種
stu = Student.objects.filter(name='小明').first()
stu_info = stu.stuinfo #建立連接,拿到擴展表對象
phone = stu_info.phone
通過電話號碼查詢學生信息
stu_info=Stuinfo.objects.filter(phone='12123124').first() #擴展表
stu = stu_info.stu #建立連接,拿到學生表對象
print(stu.name)
return HttpResponse(stu.name)
一對多
models.py
#班級表
class Grade(models.Model):
g_name = models.CharField(max_length=10)
create_time = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'grade'
#學生表
class Student(models.Model):
# Create your models here.
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# auto_now_add創(chuàng)建數(shù)據(jù)時,默認create_time字段為當前時間
create_time = models.DateTimeField(auto_now_add=True, null=True)
# 修改的時間,每次update學生信息時,修改改字段的時間為當前時間
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3,decimal_places=1,null=True)
maths = models.DecimalField(max_digits=3,decimal_places=1,null=True)
grade = models.ForeignKey(Grade,null=True)
class Meta:
# 指定Student模型映射到數(shù)據(jù)庫中,對應的表名
db_table = 'student'
views.py
通過多的一方查一的一方(通過學生查班級)
單條對象.關聯(lián)字段
stu=Student.objects.filter(name='lml').first()
grade=stu.grade
通過一的一方查多的一方(通過班級查學生)
查詢對象.關聯(lián)的表名小寫_set (固定寫法)
grade = Grade.objects.filter(g_name='python1').first()
stus = grade.student_set.all()
def add_grade(request):
Gname = ['python','java','php']
for name in Gname:
for i in range(1,5):
Grade.objects.create(g_name=name+str(i))
return HttpResponse('加入成功')
def sel_grade_by_stu(request):
stu=Student.objects.filter(name='lml').first()
grade=stu.grade
return HttpResponse('通過學生查班級')
def sel_stu_by_grade():
grade = Grade.objects.filter(g_name='python1').first()
stus = grade.student_set.all()
print(stus)
return HttpResponse('通過班級查學生')
多對多
通過人查找課程 ,并添加課程
stu=Student.objects.filter(name='lml').first()
stu.course_set.add(cou)
通過課程查找人 ,并添加人
cou=Course.objects.filter(c_name='線代').first()
cou.stu.add(stu)
tips:多對多與,一對多的一個小區(qū)別
多對一stu.grade沒有all() 因為只有多個學生只有一個班級對象
多對多cou.stu.all()有all 因為多個課程對應多個學生
models.py
學生表
class Student(models.Model):
# Create your models here.
name = models.CharField(max_length=10, unique=True)
age = models.IntegerField(default=18)
gender = models.BooleanField(default=1)
# auto_now_add創(chuàng)建數(shù)據(jù)時,默認create_time字段為當前時間
create_time = models.DateTimeField(auto_now_add=True, null=True)
# 修改的時間,每次update學生信息時,修改改字段的時間為當前時間
operate_time = models.DateTimeField(auto_now=True, null=True)
chinese = models.DecimalField(max_digits=3,decimal_places=1,null=True)
maths = models.DecimalField(max_digits=3,decimal_places=1,null=True)
grade = models.ForeignKey(Grade,null=True)
class Meta:
# 指定Student模型映射到數(shù)據(jù)庫中,對應的表名
db_table = 'student'
課程表
class Course(models.Model):
c_name = models.CharField(max_length=10)
stu = models.ManyToManyField(Student)
class Meta:
db_table = 'course'
views.py
def add_course(request):
cous =['線代','高數(shù)','物理','英語']
for c in cous:
coun = Course()
coun.c_name = c
coun.save()
return HttpResponse('創(chuàng)建班級成功')
def stu_cou(request):
stu=Student.objects.filter(name='lml').first()
cou=Course.objects.filter(c_name='線代').first()
# 通過人查找課程 ,并添加課程
stu.course_set.add(cou)
cou.stu.add(stu2)
return HttpResponse('添加和刪除學生之間的關聯(lián)關系')