Django 多对多字段的更新和插入数据实例

作者:lmw1239225096 时间:2022-09-11 01:17:04 

表的普通字段 一对多字段 多对多字段 插入数据


#插入数据
def add(request):

G_title=request.POST.get('title')#-------值为:python书本

G_publish=request.POST.get('publish') #-------值为:1
G_authors_list=request.POST.getlist('authors')#-------值为:[3,7]

publish_obj=Publish.objects.get(id=G_publish)#查找Publish表对应id的obj
authors_obj_list=Author.objects.filter(id__in=G_authors_list)#查找Author表对应id的多个obj

title  #-------普通字段
publish  #-------一对多外键
authors  #-------多对多外键

book_obj=Book.objects.create(title=G_title,publish=publish_obj)#添加普通和一对多外键的值

#添加多对多外键的值
方式一
book_obj.authors.add(*authors_obj_list)
方式二
for obj in authors_obj_list:
 book_obj.authors.add(obj)

return redirect('/index/')

表的普通字段 一对多字段 多对多字段 修改数据


def edit(request,b_id):#b_id-----为书本的id

G_title=request.POST.get('title')#-------值为:linux书本

G_publish = request.POST.get('publish')#-------值为:2
G_authors_list = request.POST.getlist('authors')#-------值为:[3,5]

book_obj = Book.objects.get(id=b_id)#查找Book表要修改的id对象

publish_obj = Publish.objects.get(id=G_publish)#查找Publish表对应id的obj
author_objs = Author.objects.filter(id__in=G_authors_list)#查找Author表对应id的多个obj

book_obj.title=G_title   #-------修改普通字段
book_obj.publish=publish_obj #-------修改一对多字段
book_obj.authors=author_objs #-------修改多对多字段
#注意:多对多字段 必须是.all()/.filter()等的查询集(QuerySet)
book_obj.save()     #-------一定得save(),才能对数据库进行修改

return redirect('/index/')

补充知识:Django的ManyToManyField(多对多)的使用以及through的作用

创建一个经典的多对多关系:一本书可以有多个作者,一个作者可以有多本书(如下)

Django 多对多字段的更新和插入数据实例

进行数据迁移,然后我们使用python manage.py sqlmigrate app(应用名) 迁移文件名 查看一下sql语句(如下):

Django 多对多字段的更新和插入数据实例

从图可以看出生成了三张表,一个是book(书籍)表包含id,title两个字段,一个是author(作者表)包含id,name,email三个字段,这是我们刚刚在models.py文件中创建两个模型,但是有一点需要注意的是在book表里面没有我们创建的authors表,而是多了一个book_authors表,在这张表里面又多了两个字段book_id,author_id,其实这个第三张表就是用来存放书籍和作者之间映射关系的中间表

那么我们如何进行数据的查询呢?

1.一本书的所有作者

b = Book.objects.get(id=1)
b.author.all()

2.一个作者的所有书籍:

a = Author.objects.get(id=1)
a.book_set.all()

3.给多对多的字段添加值(添加多对多关系):

Django 多对多字段的更新和插入数据实例

从多对多字段中删除值(删除多对多关系):

Django 多对多字段的更新和插入数据实例

可以看出这个blog_book_authors是根据多对多关系自动生成的关系表,但是如果我们想要搜集关于这个作者发布某一本书籍的时间额外增加一个字段,或者说与现有的系统集成,这个关系表已经存在了,那对于这样的情形,Django允许指定一个用于管理多对多关系的中间模型,然后就可以把这些额外的字段添加到这个中间模型中,具体的方法就是在ManyToMany字段中指定through参数指定作为中介的中间模型,修改上述models.py:

Django 多对多字段的更新和插入数据实例

查看一下此时的数据库表结构:

Django 多对多字段的更新和插入数据实例

在创建BookAuthor类的最后使用了自定义的名称,这个也可以不用指定,系统可以自动生成表名

仔细观察BookAuthor这个类,也就是我们前面讲到的中间模型,同时我们看到在创建中间模型的时候我们创建了两个外键,这两个外键定义了两个模型之间是如何关联到一起的

所以当创建多对多关系模型的时候提倡使用through参数去指定并创建中间模型,这样比较方便我们进行字段的扩展

那么此时我们又该如何添加和删除多对多关系呢?还能使用和刚刚相同的方法吗?


# 添加作者 ringo
ringo = Author.objects.create(name='Ringo',email='ringo@qq.com')
# 添加作者paul
paul = Author.objects.create(name='Paul',email='paul@qq.com')
# 添加书籍 python book1
book1 = Book.objects.create(title='python book1')
# 给多对多添加值也就是添加多对多关系
m1 = BookAuthor(author=ringo,book=book)
# 第二种添加方式
m2 = BookAuthor.objects,create(author=paul,book=book1)

当我们使用多对多的中间模型之后,add(),remove(),create()这些方法都会被禁用,所以在创建这种类型的关系的时候唯一的方法就是通过创建中间模型的实例

来源:https://blog.csdn.net/lmw1239225096/article/details/78397847

标签:Django,字段,更新,插入
0
投稿

猜你喜欢

  • python+requests接口自动化框架的实现

    2022-11-25 04:03:40
  • python K近邻算法的kd树实现

    2022-01-09 19:05:43
  • 如何检测用户第一次访问我的网站并显示友好信息?

    2009-11-25 20:33:00
  • Python机器学习之基础概述

    2021-07-18 19:07:59
  • 太有才了!让人称绝的404错误页面

    2007-08-19 15:51:00
  • Go语言转换所有字符串为大写或者小写的方法

    2023-06-21 19:48:07
  • 详解Python中的null是什么

    2022-11-30 15:33:56
  • Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)

    2021-01-23 04:23:13
  • 超简单的scrapy实现ip动态代理与更换ip的方法实现

    2022-12-21 19:58:05
  • 解决python3 HTMLTestRunner测试报告中文乱码的问题

    2021-10-19 04:34:06
  • python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法

    2021-10-25 12:14:57
  • 用户分类浅谈

    2009-09-27 12:14:00
  • Python采集大学教务系统成绩单实战示例

    2021-05-13 23:14:43
  • 重新阅读《HTTP协议基础》

    2008-04-04 17:40:00
  • 如何做一个文本书写器?

    2010-07-12 18:58:00
  • Python实现多线程抓取妹子图

    2022-10-02 15:39:25
  • Python利用pandas计算多个CSV文件数据值的实例

    2022-11-21 23:00:26
  • 编写自定义的Django模板加载器的简单示例

    2022-07-02 20:06:44
  • Python 动态变量名定义与调用方法

    2023-07-29 22:36:05
  • 简单的Apache+FastCGI+Django配置指南

    2021-01-27 10:09:16
  • asp之家 网络编程 m.aspxhome.com