1、表与表之间的关系
一对一(OneToOneField):一对一字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面
一对多(ForeignKey):一对多字段建在多的那一方
多对多(ManyToManyField):多对多字段无论建在哪张关系表里面都可以,但是推荐建在查询频率比较高的那张表里面
ps:如何判断表与表之间到底是什么关系:
换位思考
A能不能有多个B
B能不能有多个A
2、创建各个表
# 以图书管理系统为例,创建表 #modele.py文件 # 图书 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8, decimal_places=2) publish_date = models.DateField(auto_now_add=True) # 外键关系 publish = models.ForeignKey(to='Publish') # 多对多 authors = models.ManyToManyField(to='Author') # 出版社 class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) email= models.EmailField() # 作者 class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() # 一对一 authordetail = models.OneToOneField(to='AuthorDetail') # 作者信息 class AuthorDetail(models.Model): phone = models.CharField(max_length=32) addr = models.CharField(max_length=32)
改动modele.py文件后 需要执行以下命令:
python3 manage.py makemigrations
python3 manage.py migrate
3、多对多字段增删改查
#------------------------------ # 给书籍绑定与作者之间的关系 #添加关系 add:支持传数字或对象,并且都可以传多个
book_obj = models.Book.objects.filter(pk=3).first()
# 给id为3的书籍对象,添加一个对应authors为1的关系,这种关系会被记录到app01_book_authors表中 book_obj.authors.add(1) book_obj.authors.add(2,3) author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=3).first() # book_obj.authors.add(author_obj) book_obj.authors.add(author_obj,author_obj1) #------------------------------ # 修改书籍与作者的关系 set() set传的必须是可迭代对象!!! # 可以传数字和对象,并且支持传多个 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.set((1,)) book_obj.authors.set((1,2,3)) author_list = models.Author.objects.all() book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.set(author_list) #------------------------------ # 删除书籍与作者的绑定关系 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.remove(1) book_obj.authors.remove(2,3) #删一个对象 author_obj = models.Author.objects.all().first() book_obj.authors.remove(author_obj) #删多个对象 author_list = models.Author.objects.all() book_obj.authors.remove(*author_list) # 需要将queryset打散 #------------------------------ # 清空 clear() 清空的是你当前这个表记录对应的绑定关系 book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.clear()