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=来指定名字

浙公网安备 33010602011771号