day04 -關系的一對一 一對多 多對多

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)關系')
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 切換到創(chuàng)建項目的目錄 cd C:\Users\admin\Desktop\DjangoProject創(chuàng)建名為pr...
    在努力中閱讀 3,539評論 2 3
  • Web框架之Django: (1)簡介: Django是一個由Python寫成開源的重量級Web應用框架,采用MT...
    老肖閱讀 3,167評論 0 18
  • 22年12月更新:個人網(wǎng)站關停,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,415評論 22 257
  • 模塊間聯(lián)系越多,其耦合性越強,同時表明其獨立性越差( 降低耦合性,可以提高其獨立性)。軟件設計中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,226評論 0 8
  • 一、Django簡介 Django是用Python開發(fā)的一個免費開源的Web框架,可以用于快速搭建高性能,優(yōu)雅的網(wǎng)...
    仙靈兒閱讀 3,508評論 0 5

友情鏈接更多精彩內(nèi)容