Django中ForeignKey和ManyToMany使用探究:
实验所用的models:
class Publication(models.Model):
name = models.CharField(max_length=64)
def to_dict(self):
return {'id': self.id, 'name': self.name}
def __str__(self):
return f'{self.name}'
class Person(models.Model):
name = models.CharField(max_length=64)
age = models.IntegerField()
def to_dict(self):
return {'id': self.id, 'name': self.name}
def __str__(self):
return f'{self.name}'
class Book(models.Model):
name = models.CharField(max_length=64)
author = models.ForeignKey(
Person,
null=True,
on_delete=models.CASCADE,
related_name='author_book',
)
# 暂时认为一本书对应的是一个出版商
publication = models.ForeignKey(
Publication,
null=True,
on_delete=models.CASCADE,
)
def to_dict(self):
return {'id': self.id, 'name': self.name}
def __str__(self):
return f'{self.name}'
class BookShop(models.Model):
name = models.CharField(max_length=64)
book = models.ManyToManyField(
Book,
related_name='book_bookshop',
)
person = models.ManyToManyField(
Person,
related_name='author_in_bookshop',
)
publication = models.ManyToManyField(
Publication,
)
def to_dict(self):
return {'id': self.id, 'name': self.name}
def __str__(self):
return f'{self.name}'
1.ForeignKey
在1:m的关系中会用到,都是一那一方作为外键。
比如 book:person 就是 m:1的关系
django中 要在book class中进行定义: author=models.ForeignKey(Person,related_name='book')
那么在mysql中生成数据表的时候就会看见:
Book表中会有author_id一列
使用:
books = Book.objects.all()
books.first().author
# 仔细想一下,这样查出来的author,应该是一个对象,因为是外键,这是一对多的关系
# 这里很明显是每一本书都对应一个author,所以不要用什么book.first().author.all()这样的东西,不对的。
另外我们再思考一下:
persons = Person.objects.all()
persons.first().author_book.all() 就可以双向查询了
2.ManyToMany
在n:m的关系中会用到,是双方互为对方的外键。
比如 book:bookshop 就是n:m的关系
这个在哪一方中定义 其实都是可以的
但是如果Book定义在BookShop之前,就应该在Bookshop之前进行定义
否则就会出现错误。
class BookShop(models.Model):
book = models.ManyToManyField(
Book,
related_name='book_bookshop',
)
这样在mysql中会生成数据表:
book_bookshop表,表中会有id, bookshop_id,book_id三列
使用:
bookshops = BookShop.objects.all()
bookshops.first().person.all()
这个不用说了,由于多对多的关系,所以bookshop对应的肯定是多个person
同理啊
bookshops.first().book.all() 可以查询到第一家书店里面的所有书籍
我们也要思考一下这个问题:
persons = Person.objects.all()
persons.first().person_in_bookshop.all() 应该这样查
第一种定义多对多结构的方式:
class BookShop(models.Model):
person = models.ManyToManyField(
Person,
related_name='author_in_bookshop',
)
person.first().bookshop_set.all() (x) 不可以这样使用的
应该这样用:persons.first().person_in_bookshop.all() 应该这样查
第二种定义多对多结构的方式:
class BookShop(models.Model):
publication = models.ManyToManyField(
Publication,
)
publication = Publication.objects.first()
publication.bookshop_set.all() 就可以找到这家出版社 出版过的书所在的所有的书店了
但是为什么定义了related_name以后就不能使用modelname_set的原因我就不知道了
也许应该查一下manager相关的知识点,或许还得看一下源码。请知道的大佬告诉我一声.
说说这次简单实验的结论八:
定义外键或者是多对多关系的时候最好不要使用related_name这个字段
如果不定义的话就可以双向查找,如果定义了的话就...也许还有别的方法可以双向查找
但目前我的知识而言不知道怎么查= =。
============================================================================
好了,这个结论是错的,是我一开始就把related_name的含义理解错了,所以就出现了这种问题。
而且去问老张,妈的又被他吐槽了,fuck,难受。
深夜吐槽系列:
明天又是周一,又要上班了。上周五的时候因为这个多对多和外键,被老张吐槽个半死。
周五下班和另一个同事一起走的,结果得知他把俩人的工作一起全部做完了,心里一阵抽搐。
觉得自己好菜,本来想看文档的,但是看别人写的东西总是不如自己直接做来的记忆深刻。所以
熬了会儿夜,毕竟这个周末我又没看书,至少把这个 外键 和 多对多 搞清楚怎么用,是什么关系
搞懂了也算是...没白过了。
而且周一我该开始弄爬虫了,我又要被吐槽了吧.......有很多自己懂的东西,但是面对老张的
拷问......就都回答不上来了。
周六...老卢对我说:“我感觉你是不是要考个研啊”
我当时心里真的是一阵激动啊.......你干嘛当时要放老娘的鸽子,你那会儿....早点告诉我你想我考
我这会儿,我真的,自习室,挥汗如雨啊。现在都九月份了和我说,叫我怎么考....
年纪越大,记性越差的啊........老卢说等我想考研究生的时候再去问他.....我真的会误会,他是真
的想我考研,想当我导师....我这个人.....总是容易一头热,总是容易,一厢情愿。即使是他现在和
我说,我都很心动,很想飞到南开,和他说:老师,你又胖了。
哎..................................................................................
说起来王叔最近一直在面试,我总觉得他面试到人了,老张就要走了。
有点舍不得,毕竟在我找工作屡屡受挫之际是他向我伸出了手啊.......................很想孝敬一下他...哈哈哈哈
不过还是那句话:聚散有时,未来可期
反正我最后也不会留在上海,过几年就走了,就在心里祝福他吧。
Django中ForeignKey和ManyToMany使用探究:相关推荐
- django中ForeignKey指向自身的方法
2019独角兽企业重金招聘Python工程师标准>>> 我们用ForeignKey指向自身表,得到一个递归的关系. 实现方法: [python] view plaincopy fat ...
- Django中的ORM进阶操作
Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. ...
- Django中ORM操作
一.ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象 ...
- Django中Mysql数据库的使用
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作. 使用django进行数据库开发的步骤如下: 配置数据库连接信息 在配置文件中注册 ...
- 如何在Django中以GROUP BY查询?
本文翻译自:How to query as GROUP BY in django? I query a model: 我查询一个模型: Members.objects.all() And it ret ...
- 在django中区分null = True,空白= True
当我们在Django中添加数据库字段时,通常会编写models.CharField(max_length=100, null=True, blank=True) . 对ForeignKey , Dec ...
- django中聚合aggregate和annotate GROUP BY的使用方法
接触django已经很长时间了,但是使用QuerySet查询集的方式一直比较低端,只会使用filter/Q函数/exclude等方式来查询,数据量比较小的时候还可以,但是如果数据量很大,而且查询比较复 ...
- Django框架(14.Django中模型类的关系,以及模型类关联查询)
Django中模型类的关系,以及模型类关联查询 1.模型类关系 1.1 一对多关系 1.2多对多关系 1.3 一对一关系 1.4 一对多举例: 1.5 多对多举例: 1.6 一对一举例: 2.关联查询 ...
- Django中models利用ORM对Mysql 进行查表的语句(多个语句)
Django中models利用ORM对Mysql 进行查表的语句(多个语句) 字段查询 all():返回模型类对应表格中的所有数据. get(): 返回表格中满足条件的一条数据,如果查到多条数据,则抛 ...
- Django中related_name的作用
转载自:Django中related_name作用 我先定义两个模型,一个是作者,一个是作者出版的书籍,算是一对多的类型. class Person(models.Model);name = mode ...
最新文章
- python爬虫工程师-Python爬虫工程师
- 一步一步写二叉查找树
- android正则表达式隐藏邮箱地址中间字符
- MyBatis下MySqL用户口令不能为空
- 如何修改 asp.net core 5 程序的默认端口号?
- python正则表达式处理txt_Python文本处理服务(re正则表达式例子)
- 漢城博殺的日子 (一)
- 测试开发系类之接口自动化测试
- 为Raspberry Pi开发.NET应用程序:第2部分
- 作为测试人员,不要说有错误,要说有什么错误
- mysql数据库优化方向
- 惠普安装linux系统u盘,怎么用U盘安装linux系统
- 利用Python绘制ER图
- C/C++ 用zlib解压gzip文件
- 数据分析——KMeans聚类算法
- Kvaser Leaf light HS v2 | 如何使用Excel发送和接收CAN报文数据
- 半导体2013风云榜 美光大跃进
- c语言编写一个函数用静态变量求累加和,C语言程序设计I实验指导书.doc
- 搜索引擎有“破绽” seo可趁虚而入
- 很有意思的软件产品宣传画,这个美工很有创意
热门文章
- 阿里云DataV专业版发布,为可视化创造更多可能!
- 如何使用Arduino UNO开发板编程ATtiny85
- 计算机的硬盘容量可以调,怎么查看电脑硬盘容量_怎么查看电脑内存大小
- 用chrome 观看youtube视频显示中文字幕
- 需要作废的增值税发票丢失了怎么办
- Override and Overload
- Some file crunching failed, see logs for details解决方案 以及.9patch点9图片的报错的详细修改方法
- 我对onselect和onchange事件的误解
- java间接调用_无法解析类型 java.util.Map$Entry。从必需的 .class 文件间接引用了它...
- 查询中国天气网api需要用到的城市代码