首页 > 编程知识 正文

数据库多对多关系,数据库关系表是什么

时间:2023-05-03 06:39:04 阅读:60885 作者:109

1 .关系表数据操作(1)一对多表关系数据的添加修改

插入学院表情信息:常用方法是编写视图函数,添加在视图函数中插入数据的逻辑代码。 但是,这样的话,只有访问与此视图函数对应的接口才能添加成功。 不是很麻烦吗~

因此,本博客的另一个简单方法——如下图所示。 直接执行插入数据的逻辑代码就可以了。 选项卡自动补充代码哦! )

插入学生表情信息(使用普通视图插入数据) from django.httpimporthttpresponsefrom.modelsimportdepartment、Student、Course, stu_detaildefadd_user(request ) : #1.根据模型类级别的属性进行数据附加属性赋值的方法#由于模型类定义了department属性,因此此属性对象的类型为department表的类实例对象d=department.objects.get (d _ id=1) #department表的实例对象student.objects.get 外键department中的字段值必须基于department表中的类实例对象#2.数据库级字段名称添加数据。 需要注意的是外键。 (查看学生表时,名为外键的字段会自动将_id:department_id添加到模型类定义的属性之后。 ) ) ) 652的值必须是关系表中已经存在的值。 student.objects.create(s_name='美丽的花',department_id=2) return HttpResponse ) '数据插入成功!' )观察,提示插入成功:

)2)表格相关对象的访问)基本操作——普通方式

高级——为(注意点:凡是在模型类定义阶段设置了外键的属性,对应生成数据表时都会在其后加上_id。如果想单纯获取这个值,可以就数据库层面查询,使用.此属性_id即可)

前向查询: Student模型类具有定义department的属性,因此访问时,可以直接以student.department的形式找到学生所属学院的实例对象,并查询其所属学院的所有信息

由此进行灵魂的拷问:

如果我们也去拜访一个大学实例对象的学生的时候,应该怎么去拜访呢?

这将用于接下来要说的——反向查询!

终极版——反向查询反向查询:如果模型Student具有ForeignKey (反向查询属性将自动添加到相应的Department类中! 中,ForeignKey指向的模型Department实例可以在一个管理器中返回前面有ForeignKey的模型Studnet的所有实例。 默认情况下,此管理器的名称为student_set。 其中student是源模型的小写名称。 可以通过在相应的表相关API中设置related_name的值来定制。

扩展:与两个表关联的API(onetoone、Foreignkey、ManyToMany )位于谁处,通过谁查询另一个表的信息是正向查询。 相反的是反向查询。

注意:仅限一对多及多对多; 一对一没有_set属性,因此不能使用。

高级:允许在定义时设置related_name参数以复盖student_set的名称。

.1终极版——反向查询的常用方法注意:只限一对多以及多对多;一对一没有_set属性,无法使用!!!

from django.httpimporthttpresponsefrom.modelsimportdepartment,Student,Course, stu_detaildefadd_user(request ) : d=department.objects.get (d _ id=1)学院表中北大的实例D3=department.objects 系下新建学生表信息# add ) )方法:修改已存在的数据(注意:通过实例) S3=student.objectttion原始表中的数据:

访问与上述视图函数对应的接口后的数据:

一对一表格信息访问(注意:一对一表关系中使用不了反向查询!!!)

from django.http

import HttpResponsefrom .models import Department,Student,Course,Stu_detaildef add_user(request): s1 = Student.objects.get(s_id=1) # 获得一个学生的实例对象 # 注意:一对一关系的话,反向查询不能使用。所以添加数据只能如下: Stu_detail.objects.create(Student=s1, age=18, phone=123456) print(s1.stu_detail) print(dir(s1.stu_detail)) # 会发现没有反向查询_set的属性! print(s1.stu_detail.age) # 只能进行数据查询,不能添加! # 获取某个学生详情信息,正向查询查出其姓名(先正向查询到其Student实例对象,再获取s_name属性值) d = Stu_detail.objects.get(id=1) print(d.Student) print(d.Student.s_name) return HttpResponse("插入数据成功!")

输出:

Stu_detail<age=18,phone=123456>['DoesNotExist', 'MultipleObjectsReturned', 'Student', 'Student_id', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_check_column_name_clashes', '_check_field_name_clashes', '_check_fields', '_check_id_field', '_check_index_together', '_check_indexes', '_check_local_fields', '_check_long_column_names', '_check_m2m_through_same_relationship', '_check_managers', '_check_model', '_check_model_name_db_lookup_clashes', '_check_ordering', '_check_property_name_related_field_accessor_clashes', '_check_single_primary_key', '_check_swappable', '_check_unique_together', '_do_insert', '_do_update', '_get_FIELD_display', '_get_next_or_previous_by_FIELD', '_get_next_or_previous_in_order', '_get_pk_val', '_get_unique_checks', '_meta', '_perform_date_checks', '_perform_unique_checks', '_save_parents', '_save_table', '_set_pk_val', '_state', 'age', 'check', 'clean', 'clean_fields', 'date_error_message', 'delete', 'from_db', 'full_clean', 'get_deferred_fields', 'id', 'objects', 'phone', 'pk', 'prepare_database_save', 'refresh_from_db', 'save', 'save_base', 'serializable_value', 'unique_error_message', 'validate_unique']18Student<s_id=1,s_name=优秀的冰棍>优秀的冰棍

⑤多对多表信息的操作 第一部分:数据的添加及关联:

首先,课程表中添加数据:

from django.http import HttpResponsefrom .models import Department,Student,Course,Stu_detaildef add_user(request): Course.objects.create(c_name="python") Course.objects.create(c_name="java") Course.objects.create(c_name="web前端") Course.objects.create(c_name="c++") return HttpResponse("插入数据成功!")


此时,学生表也有了,下面要做的就是通过中间表将两个表关联起来!


然后,关联表:

from django.http import HttpResponsefrom .models import Department,Student,Course,Stu_detaildef add_user(request): s1 = Student.objects.get(s_id=1) #优秀的冰棍 s2 = Student.objects.get(s_id=2) #动听的鲜花 c1 = Course.objects.get(c_id=1) #python #1.数据库中已存在的数据 将学生表和课程表通过Django自动生成的中间表联系起来 s1.course.add(c1) #2.数据库中没有的数据 将学生动听的鲜花与新建的课程"人工智能"联系起来 s2.course.create(c_name="人工智能") return HttpResponse("插入数据成功!")

没有执行之前Django自动生成的中间表是空的:

执行之后Django自动生成的中间表:

第二部分:指定数据的删除及全部删除 from django.http import HttpResponsefrom .models import Department,Student,Course,Stu_detaildef add_user(request): s1 = Student.objects.get(s_id=1) #优秀的冰棍 s2 = Student.objects.get(s_id=2) #动听的鲜花 c1 = Course.objects.get(c_id=1) #python s1.course.remove(c1) #删除优秀的冰棍同学的课程python s2.course.clear() #删除动听的鲜花同学的所有课程 return HttpResponse("插入数据成功!")

(注意对于所有类型的关联字段,add()、create()、remove()和clear()都会马上更新数据库。换句话说,在关联的任何一端,都不需要再调用save()方法)

❤️可以扫码关注本人公众号——任何问题都可在公众号提问(定时有专人解答);并且不定时更新干货文。欢迎关注哦!❤️

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。