27.一对一,一对多,多对多关系表的各种骚操作

代码 代码 1471 人阅读 | 0 人回复

<
1.干系表的数据操纵

(1)一对多表干系的数据的增加修正

205427jysxycqj1wxqqlzy.png

①教院表疑息的插进:

  常规办法是写个视图函数,正在视图函数里增加插进数据的逻辑代码。可是如许的话——您得会见此视图函数对应的接谈锋气鼓鼓增加胜利!岂没有费事~
以是,本专主推出另外一种简朴的办法——以下图:间接施行插进数据的逻辑代码便可!(Tab键可主动补齐代码哦!!!)
205428nfv12fl2n2441zfn.png

②门生表疑息的插进(利用常规视图插进数据)

  1. from django.http import HttpResponse
  2. from .models import Department,Student,Course,Stu_detail
  3. def add_user(request):
  4.     #1.按照模子类层里的属性停止数据的增加            属性赋值的办法
  5.     # 由于我们正在模子类有界说了一个department的属性, 而那个属性工具的范例必需是department表的类真例工具
  6.     d = Department.objects.get(d_id=1)                    #department表的真例工具
  7.     Student.objects.create(s_name="小明",department=d)    #中键department的字段值必需department表的类真例工具
  8.     #2.按照数据库层里的字段名停止数据的增加
  9.     # 需求留意的是中键(检察门生表发明中键那个字段会主动正在模子类界说的属性前面减个_id:department_id)的值必需是联系关系表中曾经存正在的值.
  10.     Student.objects.create(s_name="小白", department_id=2)
  11.     return HttpResponse("插进数据胜利!")
复造代码
③察看可知插进胜利:

205428s7250e7we78wmp2e.png

(2)表联系关系工具的会见:

①基操——一般方法

205428o959pxxluu1wubcu.png

205428jrbcmh4kmttptp3l.png

②进阶——正背查询

(留意面:但凡正在模子类界说阶段设置了中键的属性,对应天生数据表时城市正在厥后减上_id。假如念纯真获得那个值,能够便数据库层里查询,利用.此属性_id便可)
  正背查询:Student的模子类中我们有界说department的属性,以是当我们来会见的时分,能够间接经由过程student.department的情势来找到某个门生所属教院的真例工具,进而查询其所属教院的一切疑息。
由此收回魂灵拷问:
假如我们也期望正在正在会见某个教院的真例工具的门生的时分该怎样会见呢???
那便用到了接下去要讲的——反背查询!!!
205428pf7vmf14vl7yxek6.png

③最终版——反背查询

  反背查询:假如模子Student有一个ForeignKey(会主动给对应的Department类增加一个反背查询的属性!),那末该ForeignKey 所指的模子Department真例能够经由过程一个办理器回到前里有ForeignKey的模子Studnet的一切真例。默许状况下,那个办理器的名字为student_set(能够正在对应的表联系关系API中经由过程设置related_name的值去自界说),此中student是源模子的小写称号。

拓展:两个表联系关系的API(OneToOne,Foreignkey,ManyToMany)正在谁那,经由过程谁来查询另外一个表的疑息便是正背查询;反之便是反背查询。
留意:只限一对多和多对多;一对一出有_set属性,没法利用!!!
205429knc01qn0gqq50lc9.png


拓展:

  能够正在界说时设置related_name 参数去笼盖student_set的称号!
205429vx0p0opj03pwpxbt.png


③.1 最终版——反背查询的一些经常使用办法

留意:只限一对多和多对多;一对一出有_set属性,没法利用!!!
  1. from django.http import HttpResponse
  2. from .models import Department,Student,Course,Stu_detail
  3. def add_user(request):
  4.     d = Department.objects.get(d_id=1)                     #教院表中北年夜的真例
  5.     d3 = Department.objects.get(d_id=3)                    #教院表中中科的真例
  6.     # create()办法:新建数据
  7.     d.student_set.create(s_name="小王")     #正在北年夜院系下新建一个门生表疑息
  8.     # add()办法:修正曾经存正在的数据(留意:经由过程真例)
  9.     s3 = Student.objects.get(s_id=2)        #将s_id为2的门生的院系从北年夜换到中科
  10.     d3.student_set.add(s3)
  11.     return HttpResponse("插进数据胜利!")
复造代码
本初表中数据:
205429binf7tnfqanitf0t.png
会见上述视图函数对应接心后的数据:
205429tgxds7ifjxps0j7c.png


④一对一表疑息的会见

(留意:一对一表干系中利用没有了反背查询!!!)
  1. from django.http import HttpResponse
  2. from .models import Department,Student,Course,Stu_detail
  3. def add_user(request):
  4.     s1 = Student.objects.get(s_id=1)  # 得到一个门生的真例工具
  5.     # 留意:一对一干系的话,反背查询不克不及利用。以是增加数据只能以下:
  6.     Stu_detail.objects.create(Student=s1, age=18, phone=123456)
  7.     print(s1.stu_detail)
  8.     print(dir(s1.stu_detail))  # 会发明出有反背查询_set的属性!
  9.     print(s1.stu_detail.age)  # 只能停止数据查询,不克不及增加!
  10.     # 获得某个门生详情疑息,正背查询查出其姓名(先正背查询到其Student真例工具,再获得s_name属性值)
  11.     d = Stu_detail.objects.get(id=1)
  12.     print(d.Student)
  13.     print(d.Student.s_name)
  14.     return HttpResponse("插进数据胜利!")
复造代码
输出:
  1. Stu_detail<age=18,phone=123456>
  2. [&#39;DoesNotExist&#39;, &#39;MultipleObjectsReturned&#39;, &#39;Student&#39;, &#39;Student_id&#39;, &#39;__class__&#39;, &#39;__delattr__&#39;, &#39;__dict__&#39;, &#39;__dir__&#39;, &#39;__doc__&#39;, &#39;__eq__&#39;, &#39;__format__&#39;, &#39;__ge__&#39;, &#39;__getattribute__&#39;, &#39;__getstate__&#39;, &#39;__gt__&#39;, &#39;__hash__&#39;, &#39;__init__&#39;, &#39;__init_subclass__&#39;, &#39;__le__&#39;, &#39;__lt__&#39;, &#39;__module__&#39;, &#39;__ne__&#39;, &#39;__new__&#39;, &#39;__reduce__&#39;, &#39;__reduce_ex__&#39;, &#39;__repr__&#39;, &#39;__setattr__&#39;, &#39;__setstate__&#39;, &#39;__sizeof__&#39;, &#39;__str__&#39;, &#39;__subclasshook__&#39;, &#39;__weakref__&#39;, &#39;_check_column_name_clashes&#39;, &#39;_check_field_name_clashes&#39;, &#39;_check_fields&#39;, &#39;_check_id_field&#39;, &#39;_check_index_together&#39;, &#39;_check_indexes&#39;, &#39;_check_local_fields&#39;, &#39;_check_long_column_names&#39;, &#39;_check_m2m_through_same_relationship&#39;, &#39;_check_managers&#39;, &#39;_check_model&#39;, &#39;_check_model_name_db_lookup_clashes&#39;, &#39;_check_ordering&#39;, &#39;_check_property_name_related_field_accessor_clashes&#39;, &#39;_check_single_primary_key&#39;, &#39;_check_swappable&#39;, &#39;_check_unique_together&#39;, &#39;_do_insert&#39;, &#39;_do_update&#39;, &#39;_get_FIELD_display&#39;, &#39;_get_next_or_previous_by_FIELD&#39;, &#39;_get_next_or_previous_in_order&#39;, &#39;_get_pk_val&#39;, &#39;_get_unique_checks&#39;, &#39;_meta&#39;, &#39;_perform_date_checks&#39;, &#39;_perform_unique_checks&#39;, &#39;_save_parents&#39;, &#39;_save_table&#39;, &#39;_set_pk_val&#39;, &#39;_state&#39;, &#39;age&#39;, &#39;check&#39;, &#39;clean&#39;, &#39;clean_fields&#39;, &#39;date_error_message&#39;, &#39;delete&#39;, &#39;from_db&#39;, &#39;full_clean&#39;, &#39;get_deferred_fields&#39;, &#39;id&#39;, &#39;objects&#39;, &#39;phone&#39;, &#39;pk&#39;, &#39;prepare_database_save&#39;, &#39;refresh_from_db&#39;, &#39;save&#39;, &#39;save_base&#39;, &#39;serializable_value&#39;, &#39;unique_error_message&#39;, &#39;validate_unique&#39;]
  3. 18
  4. Student<s_id=1,s_name=小明>
  5. 小明
复造代码
205430ykh1gkgfua11ak3u.png

⑤多对多表疑息的操纵

第一部门:数据的增加及联系关系:

起首,课程表中增加数据:
  1. from django.http import HttpResponse
  2. from .models import Department,Student,Course,Stu_detail
  3. def add_user(request):
  4.     Course.objects.create(c_name="python")
  5.     Course.objects.create(c_name="java")
  6.     Course.objects.create(c_name="web前端")
  7.     Course.objects.create(c_name="c++")
  8.     return HttpResponse("插进数据胜利!")
复造代码
205430aig2ihi1esecm1cc.png

此时,门生表也有了,上面要做的便是经由过程中心表将两个表联系关系起去!
205430wa3a6kbozkzo0ejr.png

然后,联系关系表:
  1. from django.http import HttpResponse
  2. from .models import Department,Student,Course,Stu_detail
  3. def add_user(request):
  4.     s1 = Student.objects.get(s_id=1)        #小明
  5.     s2 = Student.objects.get(s_id=2)        #小白
  6.     c1 = Course.objects.get(c_id=1)         #python
  7.     #1.数据库中已存正在的数据       将门生表战课程表经由过程Django主动天生的中心表联络起去
  8.     s1.course.add(c1)
  9.     #2.数据库中出有的数据          将门生小白取新建的课程"野生智能"联络起去
  10.     s2.course.create(c_name="野生智能")
  11.     return HttpResponse("插进数据胜利!")
复造代码
出有施行之前Django主动天生的中心表是空的:
205430yezlr2nztxtfextq.jpg

施行以后Django主动天生的中心表:
205430kye7fjde4xmmxrer.png

第两部门:指定数据的删除及局部删除

  1. from django.http import HttpResponse
  2. from .models import Department,Student,Course,Stu_detail
  3. def add_user(request):
  4.     s1 = Student.objects.get(s_id=1)        #小明
  5.     s2 = Student.objects.get(s_id=2)        #小白
  6.     c1 = Course.objects.get(c_id=1)         #python
  7.     s1.course.remove(c1)                #删除小明同窗的课程python
  8.     s2.course.clear()                   #删除小白同窗的一切课程
  9.     return HttpResponse("插进数据胜利!")
复造代码
205431f27itn4x2wqlszxl.png

(留意关于一切范例的联系关系字段,add()、create()、remove()战clear()城市即刻更新数据库。换句话道,正在联系关系的任何一端,皆没有需求再挪用save()办法)
❤️能够扫码存眷自己公家号——任何成绩皆可正在公家号发问(按时有专人解问);而且没有按时更新干货文。欢迎存眷哦!❤️
205431ss66fe626yfhhpjh.jpg


免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则