n对n

创建一对一的关系: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="111",publish_id=1)
      

      # 方式二:推荐 pub_obj = Publish.objects.filter(name="人民出版社")[0] print(pub_obj) Book.objects.create(title = "简爱",publishDdata="2000-6-6",price="222",publish=pub_obj)

      # 方式三:save pubObj= Publish.objects.get(name="人民出版社") #只有一个的时候用get,拿到的直接就是一个对象 bookObj = Book(title = "真正的勇士",publishDdata="2015-9-9",price="50",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="222", 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=来指定名字

 

posted @ 2018-05-26 18:59  慕沁  阅读(348)  评论(0)    收藏  举报