Django学习------ORM关系映射

一、一对一映射

1.1、什么是一对一

A表中的一条记录只能与B表中的一条记录相关联
如:一夫一妻制

1.2、语法

允许在关联的两个类的任何一个类中 增加:
属性 = models.OneToOneField(Entry)

class Author(models.Model):
	name = models.CharField('姓名',max_length=11)
	
class Wife(models.Model):
  name = models.CharField('姓名',max_length=11)
  author=models.OneToOneField(Author)

1.3、查询

创建数据

al = Author.objects.create ( name= ' wang ' )
wl = wife.objects.create(name=' wangfuren ' , author=a1)

查询

#1、正向查询:通过wife 找 author
wife = Wife.objects.get(id=1)
author = wife.author

#2、反向查询:通过author 找 wife

#wife 是Django通过OneToOneField在Author中默认增加的一个隐式属性

author=Author.objects.get(id=14)
wife = author.wife

二、一对多映射

2.1、什么是一对多

A表中的一条数据可以与B表中的多条数据关联
B表中的一条数据只能与A表中的一条数据关联

如:出版社(Publisher) 和 图书(Book)

商品类型(GoodsType) 和 商品(Goods)

2.2、在数据库中的体现

通过外键(ForeignKey)来体现一对多
在"多"表中增加外键(ForeignKey)对"一"表的主键进行引用

2.3、语法

使用外键(ForeignKey)
在"多"的实体中,增加:
属性=models.ForeignKey(Entry)

from django.db import models
# Create your models here.
class Publisher( models.Model ):
#出版社[一]
	name = models.CharField( '出版社名称',max_length=50)
class Book ( models.Model):
	#书名[多]
	title = models.CharField('书名',max_length=11)
	publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)

2.4、查询

创建数据

from .models import *
pub1 = Publisher.objects.create(name='轻工业出版社')
#两种创建方式
Book.objects.create(title='C++', publisher=pub1)
Book.objects.create(title='Java", publisher_id=1)

查询

#1、正向查询 - 通过Book查询Publisher
book = Book.objects.get(id=1)
publisher = book.publisher
#2、反向查询 - 通过Publisher查询Book

#Django会在 1 的实体中增加 关联对象_set 属性,用于查询 多 的数据

#结合 Publisher 和 Book 之间关系 :在 Publisher实体中增加了一个 book_set 属性

publisher=Publisher.objects.get(id=1)
books = publisher.book_set.all()

三、多对多映射

3.1、什么是多对多

A表中的一条记录可以与B表中的任意多条记录匹配
B表中的一条记录可以与A表中的任意多条记录匹配
如:作者与书籍

3.2、在数据库中的体现

必须创建第三张表,关联涉及到的两张表数据
Django自动生成第三张表

3.3、语法

允许在任何一个实体中增加操作:

entry = models.ManyToManyField(Entry)
from django.db import models
# Create your models here.
class Author( models.Model):
	name = models.CharField('姓名',max_length=11)

class Book(models.Model):
	title = models.CharField( '书名',max_length=11)
	authors = models.ManyToManyField(Author)

在这里插入图片描述

3.4、查询

创建数据

方案1先创建author 再关联book
author1 = Author.objects.create (name='牛老师')
author2 = Author.objects.create(name='刘老师')
#牛老师和刘老师同时写了一本Python
#两种创建方式
book11 = author1.book_set.create(title="Python")
author2 .book_set.add (book11)
方案2先创建book再关联author
book = Book.objects.create(title= 'python')
#两种创建方式
author3 = book.authors.create(name='宋老师')
book.authors.add(author1)

查询


1、正向查询-通过Author查询所有的Book
author = Author.objects.get(id=1)
books = author.book.all()

2、反向查询-通过Book查询所有的Author
Django中 会在Book 实体中增加一个隐式属性 author_set

book = Book.objects.get(id=1)
authors = book.author_set.all()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韭菜盖饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值