当前位置: 首页 > 编程笔记 >

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

堵浩波
2023-03-14
本文向大家介绍Django 多对多字段的更新和插入数据实例,包括了Django 多对多字段的更新和插入数据实例的使用技巧和注意事项,需要的朋友参考一下

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

#插入数据
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的作用

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

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

从图可以看出生成了三张表,一个是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.给多对多的字段添加值(添加多对多关系):

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

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

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

在创建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()这些方法都会被禁用,所以在创建这种类型的关系的时候唯一的方法就是通过创建中间模型的实例

以上这篇Django 多对多字段的更新和插入数据实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 问题内容: 我们已经为此苦苦挣扎了几天,并在网络上进行了大量搜索。 我们试图弄清楚条目如何以Django形式保存到许多字段。 例如,我们有一个新闻模型,该模型与图像具有多对多的关系。当我们将图像添加到新闻文章中时,例如ID为10、2、14的图像,我们可以看到保存新闻文章表单时的帖子值如下: photos 10 photos 2 photos 14 当我们查看多对多交叉表时,顺序没有保留。我们看不到

  • 本文向大家介绍django 多对多表的创建和插入代码实现,包括了django 多对多表的创建和插入代码实现的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了django-多对多表的创建和插入代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 表的创建 数据的添加 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐

  • 问题内容: 我试图在 Flask-SQLAlchemy中 建立多对多关系,但似乎我不知道如何填写 “多对多标识符数据库” 。您能帮我了解我在做什么错以及应该怎么看吗? 然后是我的标识符数据库: 到目前为止,当我尝试将数据插入数据库时​​,看起来像这样。 现在我的问题是,由于我真的无法创建“ student_identifier”对象,如何将其添加到多对多数据库?如果可以的话,它可能看起来像这样:

  • 问题内容: 我是python和django rest的新手。但我很困惑。最好的方法是什么 更新django rest框架中的多对多关系。我看了文件 时,以 指定了直通模型的ManyToManyField设置为只读。 如果显式指定一个指向ManyToManyField的关系字段 对于直通模型,请确保将read\u only设置为True。 如果我有密码 这将返回技能作为对象列表。我没有办法更新 他们

  • 问题内容: 考虑以下模型和形式: 当你查看ToppingForm时,它使你可以选择浇头所用的披萨,而一切都太花哨了。 我的问题是:如何为披萨定义一个ModelForm,让我利用披萨和馅料之间的多对多关系,并让我选择披萨上的馅料? 问题答案: 我想你会在这里新添加到你,并手动链接,表单字段与模型领域,如Django会不会为你做自动。 以下代码段可能会有所帮助: 这然后可以使用无处不在,甚至在admi

  • 问题内容: 我想表达以下声明: 子选择返回一行,其中包含两列(和),需要将其插入到target中。这样做的原因是,是的主键。是指(外键)。 这可能吗? 问题答案: 我不确定首先使用哪种SQL方言是否可能通过,但是您当然可以使用以下方式表达这种查询: 或与jOOQ