创建一对一的关系:OneToOne("要绑定关系的表名")

创建一对多的关系:ForeignKey("要绑定关系的表名")

创建多对多的关系:ManyToMany("要绑定关系的表名")  会自动创建第三张表

from django.db import models

# Create your models here.
class Book(models.Model):
nid = models.AutoField(primary_key=True) # 自增id(可以不写,默认会有自增id)
title = models.CharField(max_length=32)
publication_date = models.DateField() # 出版日期
price = models.DecimalField(max_digits=5, decimal_places=2) # 一共5位,保留两位小数
publish = models.ForeignKey("Publish",null=True,on_delete=models.CASCADE)
#允许外键接受空值
authorlist = models.ManyToManyField("Author") #建立的多对多的关系
def __str__(self):
return self.title class Publish(models.Model):
#不写id的时候,且有表关联时,数据库会自动给你增加自增id
name =models.CharField(max_length=32)
addr = models.CharField(max_length=32)
def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField() class AuthorDeital(models.Model):
tel = models.IntegerField()
addr = models.CharField(max_length=32)
author = models.OneToOneField("Author",on_delete=models.CASCADE) #建立的一对一的关系

临时添加的字段,首先你得考虑之前的数据有没有。设置一个默认值。

    wordNum  = models.IntegerField(default=0)

正向查询:子-----》主

反向查询:主------》子

一对一

    •     # 一对一的查询
      # 正向查询:手机号为12345的作者的姓名
      # deital_obj = AuthorDeital.objects.filter(tel="12345").first()
      # print(deital_obj.author.name)
      # print(type(deital_obj)) # 反向查询:查询egon的手机号
      egon_obj = Author.objects.filter(name="egon").first()
      print(egon_obj.authordeital.tel)
    •    # 第一种查法
      ret = Book.objects.filter(title="简爱").values("publish__addr")
      print(ret)
      # 第二种查法
      ret2 = Publish.objects.filter(book__title="简爱").values("addr")
      print(ret2)

一对多

    • # 一对多的添加
      # 方式一:如果是这样直接指定publish_id字段去添加值,前提是你的主表里面必须有数据
      # 主表:没有被关联的(因为book表是要依赖于publish这个表的)也就是publish表
      # 子表:关联的表
      Book.objects.create(title="追风筝的人",publication_date"2015-5-8",price="",publish_id=1) # 方式二:推荐
      pub_obj = Publish.objects.filter(name="人民出版社")[0]
      print(pub_obj)
      Book.objects.create(title = "简爱",publishDdata="2000-6-6",price="",publish=pub_obj) # 方式三:save
      pubObj= Publish.objects.get(name="人民出版社") #只有一个的时候用get,拿到的直接就是一个对象
      bookObj = Book(title = "真正的勇士",publishDdata="2015-9-9",price="",publish=pubObj)
      bookObj.save()
    • 当跨表匹配时,用__进行匹配
    • update
    •     # 正向查询:查询追风筝的人这本书的出版社的地址
      # book_obj = Book.objects.filter(title="追风筝的人")[0] # 找对象
      # print("======", book_obj.publish) # 拿到的是关联出版社的对象
      # print(book_obj.publish.addr) # 反向查询:查询人民出版社出版过的所有的书的价格和名字
      pub_obj = Publish.objects.filter(name="铁道出版社")[0]
      book_dic = pub_obj.book_set.all().values("price", "title")
      print(book_dic)
      print(book_dic["price"])
    • 基于__的查询(使用__跨表查询)

多对多

 书和作者是多对多的关系:一个书可以有多个作者,一个作者可以出版多本书

  步骤:先找到书对象

     再找到需要的作者对象

     给书对象绑定作者对象(用add方法),也就是绑定多对多的关系

    • # 多对多的添加的两种方式
      # 方式一:
      # 先创建一本书:
      # pub_obj = Publish.objects.filter(name="人民出版社").first()
      # book_obj = Book.objects.create(title="醉玲珑",
      publication_date="2015-4-10",
      price="", publish=pub_obj)
      #通过作者的名字django默认找到id
      # book_obj=Book.objects.get(title="醉玲珑")
      # hai_obj = Author.objects.all()[0]
      # egon_obj = Author.objects.all()[2]
      # xiaoxiao_obj = Author.objects.all()[1] # 绑定多对多的关系、
      # book_obj.authorlist.add(hai_obj, egon_obj, xiaoxiao_obj) #重置关系set
      旧的删除,新的添加,重复的不变
      obj.authorlist.set([*****]) # 解除多对多关系
      book_obj = Book.objects.filter(title="简爱").last() # 找到书对象
      authers = Author.objects.filter(id__lt=3) # 找到符合条件的作者对象
      book_obj.authorlist.remove(*authers) # 因为清除的是多条,得加个* # 清除关系方法(clear)
      book_obj = Book.objects.filter(title="红楼梦")
      for book_obj_item in book_obj: # 把所有红楼梦的都给清空了
      book_obj_item.authorlist.clear()
      # 总结:remove和clear的区别
      #   remove:得吧你要清除的数据筛选出来,然后移除
      #   clear:不用查,直接就把数据都清空了。
    • 1
    • # 多对多的查询
      # 正向查询:查询追风筝的人的这本书的所有的作者的姓名和年龄
      # book_obj = Book.objects.filter(title="追风筝的人")[0]
      # print(book_obj.authorlist.all().values("name", "age"))
      # 这本书关联的所有作者对象的集合 # 反向查询:查询作者是egon的这个人出了哪几本书的信息
      author_obj = Author.objects.filter(name="egon")[0]
      print("bookinfo====", author_obj.book_set.all().first().title)
      # 与该作者关联的所有书对象的集合
反向查询:
默认:
obj.子表name_set.filter() 子表name_set可以再子表创建时用related_name=来指定名字

随机推荐

  1. 公共的JS组件-告别CURD

    urls.py urlpatterns = [ url('^asset.html$', views.AssetView.as_view()), url('^asset-json.html$', vie ...

  2. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

  3. linux -- 添加、修改、删除路由

    在日常的使用中,或者在服务器中,有两个网卡配置两个地址,访问不同的网络段,这种情况是非常常见的现象,但是,我们需要额外的添加路由表来决定发送的数据包经过正确的网关和interface才能正确的进行通信 ...

  4. 背景图片固定不随页面上下滚动而滚动 ,属性 background-attachment

    <div id="testimonials-section" class="text-center"> </div> css: #tes ...

  5. Pyqt5-Python应用开发——第一个小程序的实现

    环境:python 3.6.6 编辑器:pycharm 其他:QtDesigner:Qt Designer,是一个直观可见的全方位 GUI 构造器,它所设计出来的用户界面能够在多种平台上使用.它是 Q ...

  6. Java面试准备之Java基础

    1.Java 语言的优点 面向对象,平台无关,内存管理,安全性,多线程,Java 是解释型的 2.Java 和 C++的区别 多重继承(java接口多重,类不支持,C++支持) 自动内存管理 预处理功 ...

  7. FineUIPro v5.2.0已发布(jQuery升级,自定义图标,日期控件)

    FineUIPro/MVC/Core/JS v5.2.0 已经于 2018-8-20 发布,官网示例已更新,如果大家在测试中发现任何问题,请回复本帖,谢谢了. 在线示例: FineUI Pro:htt ...

  8. 传统C/S软件的"断骨增高"

    前言: 由于院内临床业务需要高频强功能的用户界面互操作性要求,使得在HIT行业中存在大量的C/S型软件,尽管B/S软件应用范围正在扩大,但在很多场景中,C/S软件仍然顽强的生存和发展着. 不过随着行业 ...

  9. 用 C# 编写 C# 编译器,先有鸡还是先有蛋?

    前段时间翻译了一篇文章 微软是如何重写 C# 编译器并使它开源的,文章讲了微软用 C# 重写 C# 编译器的坎坷路,引发了一些童鞋的思考:用 C# 编写 C# 编译器(Roslyn),那么 C# 编译 ...

  10. ondaHTTPError: HTTP 000 CONNECTION FAILED for url

    可能是网络问题,换网络. 可能是获取库的IP无法链接到,换库的IP,如添加清华镜像IP等.