模型基本关系



一、“一对多”关系

    1.实现方式

    通过在“多”方模型类中添加外键属性 ForeignKey  

class School(models.Model):   #“一方”模型

        name = models.CharField(max_length=30)
        address = models.CharField(max_length=30)
        history = models.TextField(null=True)

class Student(models.Model):
        name = models.CharField(max_length=20)
        age = models.InterField()
        score = models.FloatField()
        sex = models.CharField(max_length=10)
        school = models.ForeignKey(School,on_delete=models.CASCADE)

   2、对象之间的关联

    2.1方式一

    方式一:通过"多"方模型的外键类属性关联"一"方模型的实例化对象

#添加学校对象(“一”方模型)
school1 = School.objects.create(name=‘清华大学‘,address=‘北京海淀区’)

school2 = School.objects.create(name=‘北京大学‘,address=‘北京‘,history=‘北京大学是一所知名大学‘)

school3 = School.objects.create(name=‘西安交通大学‘,address=‘西安‘,history=‘西安交大是一所很好的大学‘)

#通过外键类属性关联

stu1 = Student.objects.create(name=‘张三‘,age=20,score=93,sex=‘男‘,school = School1) 

     2.2方式二

    方式二:通过“多”方对应表的外键关联"一"方  

#两个学生都上id为3的学校

stu3 = Student.objects.careate(name=‘李志‘,age=40,score=89,sex=‘男‘,school_id=3)

stu4 = Student.objects.careate(name=‘阿玛尼‘,age=35,score=89,sex=‘女‘,school_id=3)

   3、查询

    3.1从“一”方查询"多"方

     一方的实例化对象.多方模型类名小写_set.all() 

#查询1号学校所有的学生:
school = School.objects.get(id=1)
students = school.student_set.all()

   3.2从“多”方查询“一”方

   通过多方设置的关联类属性查询

#查询5号学生对应的学校:
student = Student.objects.get(id=5)
school = student.school

二 、"一对一"关系

  1、实现方式

  在负责维护关系的“一”方添加OneToOneField型的类属性

class Person(models.Model):
        name = modles.CharField(max_length=20)
        age = models.IntergerField()
        sex = models.CharField(max_length=10)

class Card(models.Model):
        cardno = models.CharField(max_length=20,unique=True) #卡号类属性
        color = models.CharField(max_length=10)
        person = models.OneToOneField(Person,on_delete=models.CASCADE)#使用OneToOneField进行‘一对一’关联

   2、对象间关联

    2.1方式一

  通过主动一方模型类属性,关联另一方对象

  

  #创建人对象
  per = Person(name=‘张三‘,age=20,sex=‘男‘)

  per.save()

  #通过Card类的person属性关联

  card = Card(cardno=‘zs123456‘,color=‘绿卡‘,person=per)

  card.save()

   2.2方式二

  通过对应表到的唯一外键字段关联 

  per1 = Person(name=‘李四‘,age=22,sex=‘男‘)

  per1.save()

  card1 = Card.objects.create(cardno=‘ls123456‘,color=‘黄色‘,person_id=per1.id)

  

    3.查询

   3.1从维护关系的“一”方查询

   使用模型类中维护关系的那个类属性 


  #查询3号卡关联的人


  card = Card.objects.get(id=3)


  per = card.person # 使用关联的类属性查询

 

   3.2从不维护关系的“一”方查询

   使用对方模型类名的小写   

#查询1号人的卡:

per1 = Person.objects.get(id=1)

card1 = per1.card  # 使用对方模型类名的小写

  

三、“多对多”关系

  1、实现方式

  在某个“多”方使用ManyToManyField,关联另一个“多”方和第三方模型维护关系

  

from django.db import models

class Member(models.Model):   # 成员模型
    name = models.CharField(max_length=20)
    age = models.IntegerField()
    sex = models.CharField(max_length=10)

    def __str__(self):
        return self.name

class Community(models.Model):  # 社团模型
    name = models.CharField(max_length=20)
    buildtime = models.DateField()
    members = models.ManyToManyField(Member,through="Relation")

    def __str__(self):
        return self.name

class Relation(models.Model):
    member = models.ForeignKey(Member,on_delete=models.CASCADE)
    community = models.ForeignKey(Community,on_delete=models.CASCADE)
    join_reason = models.CharField(max_length=100)

   

  2、对象间关系

  通过第三方模型对象维护

  

创建Member对象:
member1 = Member.objects.create(name=‘马小跳‘,age=20,sex=‘男‘)

member2 = Member.objects.create(name=‘李丽丽‘,age=25,sex=‘女‘)
member3 = Member.objects.create(name=‘黄大牛‘,age=35,sex=‘男‘)

创建Community对象:
community1 = Community.objects.create(name=‘天涯吉他社‘,buildtime=date(2016,6,6))

community2 = Community.objects.create(name=‘读书会‘,buildtime=date(2017,10,1))
 community3 = Community.objects.create(name=‘瑜伽协会‘,buildtime=date(2008,9,3))

创建Relation关系对象,通过实例化对象关联:
r1 = Relation.objects.create(member=member2,community=community1,join_reason=‘好玩‘)

通过外键值关联:
r2 = Relation.objects.create(member_id=member3.id,community_id=community1.id,join_reason=‘交朋友‘)

   

  3、查询

  3.1 从主动维护关系的“多”方查询

  通过关联的类属性查询另一方.all()

   

查询3号社团所有的成员:
方式一:借助中间模型查询:
community = Community.objects.get(id=3)
relations = Relation.objects.filter(community=community)

 for r in relations:
      print(r.member)

方式二:借助关联的类属性直接查询

all_members = community.members.all()
for m in all_members:
     print(m)

   

  3.2 从不负责维护关系的“多”方查询

  对方模型类名小写_set.all()

查询1号成员参加的社团:
member1 = Member.objects.get(id=1)
all_community = member1.community_set.all()
for c in all_community:
     print(c)

原文地址:https://www.cnblogs.com/huiyichanmian/p/10268824.html

时间: 2024-10-03 01:27:13

模型基本关系的相关文章

数据库系统原理——ER模型与关系模型

    数据库系统是软件的一种,数据库系统自然而然也有他自己的生命周期--生存期.它的生存期从规划开始,一直到将它卸载不用了.它的中间过程很复杂,为了实现用户的想法,数据库有关人员将现实生活中的数据进行抽象,然后在进行分类与操作,让后将数据整合到一起,将它们封装成了一个系统让用户使用它,最后数据库有关人员在对它们的成果进行不断地维护,这样不仅满足了用户的需要,还体现了全心全意为人民服的观点.     1  软件与数据库的关系     数据库系统是软件这一个超类的实例化成的一个子类而已,当然,还可

深入理解 Laravel Eloquent(三)——模型间关系(关联)

Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了).所谓 "对象",就是本文所说的 "模型(Model)":对象关系映射,即为模型间关系.中文文档: http://laravel-china.org/docs/eloquent#relationships 下

Laravel Eloquent—模型间关系(关联)

Eloquent是什么 Eloquent 是一个 ORM,全称为 Object Relational Mapping,翻译为 "对象关系映射"(如果只把它当成 Database Abstraction Layer 数组库抽象层那就太小看它了).所谓 "对象",就是本文所说的 "模型(Model)":对象关系映射,即为模型间关系.中文文档: http://laravel-china.org/docs/eloquent#relationships 下

Laravel5.1 模型 --一对一关系

这篇文章主要记录模型的一对一关系,关联关系是Model的一种非常方便的功能. 1 实现一对一关系 1.1 准备工作 首先我们需要创建两张表和对应的两个模型,第一个模型是用户表,第二个模型是账号表. 这里 我们的逻辑是:一个用户信息下只能有一个账号,一个账号只能被一个用户所拥有,这就是一对一关系. 1.1.1 用户信息表 生成模型和迁移文件: php artisan make:model UserInfo -m 编写迁移文件(表规格): public function up() { Schema:

9.3总体设计——毕业论文系统设计类图及各ER模型图关系图

原文地址:https://www.cnblogs.com/melody-yang/p/8715674.html

数据库精华知识点总结(1)—数据库的三层模式和二级映像,E-R(实体联系图)图,关系模型

Data base: 长期存储在计算机内,有组织的,可共享的大量数据集合.基本特征:永久存储,可共享,有一定的物理和逻辑结构. Data base manage system(DBMS):用户和os之间的一层数据管理软件. 1.提供数据操纵语言DML对数据库增删改查 2.数据库的建立和维护 3.提供数据控制功能:在数据库建立,运行和维护时,DBMS管理数据的安全性,完整性,并发控制和故障的系统恢复,(也就是数据库的事务管理和运行管理) 4.与其它软件系统通信 Data base system(D

字符设备驱动、平台设备驱动、设备驱动模型、sysfs的关系

Linux驱动开发的童鞋们来膜拜吧:-)  学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sysfs等相关概念和技术.对于初学者来说会非常困惑,甚至对Linux有一定基础的工程师而言,能够较好理解这些相关技术也相对不错了.要深刻理解其中的原理需要非常熟悉设备驱动相关的框架和模型代码.网络上有关这些技术的文章不少,但多是对其中的某一点进行阐述,很难找到对这些技术进行比较和关联的分析.对于开发者而言,能够熟悉某一点并分享出来已很难得,但对于专注传授技术和经验给

数据仓库数据库设计方法---关系模型和多维模型比较分析

数据仓库中广泛采用的数据库设计模型有两种:关系型和多维型.普遍认为在数据仓库的设计方法中关系模型是“Inmon”方法而多维模型是“Kimball”方法. 先来看下关系模型,关系型数据以一种称为“标准化”的形式存在.数据标准化是指数据库设计会使数据分解成非常低的粒度级,标准化数据以一种孤立模式 存在,这种情况下对数据表里的数据关系要求很严格.一般遵循3NF范式.采用关系型设计的数据库一般具有较强的灵活性和多功能性(可以支持数据的多种视 图). 再来看下多维模型,多维模型一般有星型模式.雪花模式.混

数据库-关系模型

在用户观点下,逻辑结构是一张二维表 关系-一张表 Tuple 元组一行 attribute一列一个属性 主码 (key)某个属性组 可以确定一个唯一元组 域(Domain ):一组具有相同数据类型值的集合 分量-元组中的一个属性值 关系模型-对关系的描述 关系名(属性1,属性2....) 在关系模型中每个分量不可再分 数据操作是集合操作操作对象和结果都是关系,用户只要知道找什么就行不用知道怎么找 完整性约束条件: 实体完整性 参照完整性 用户定义完整性 优点: 建立在数学概念上,而已概念单一.