一、表与表之间的关系
一对一:(OneToOneField) 关系字段无论建在哪张表里都可以,但是推荐建在查询频率比较高的那张表
【publish = models.ForeignKey(to=‘Publish‘)】
一对多:(ForeignKey) 一对多字段建在多的那一方
多对多:(ManyToManyField) 多对多字段无论建在哪张关系表里都可以,但是推荐建在查询频率比较高的那张表
ps: 如何判断表与表之间到底什么关系
换位思考:A能不能有多个B
B能不能有多个A
增改删:可以是数字,也可以是对象
add() # 添加
set() # 修改
remove() #不能接收可迭代对象,可以* querySet对象
clear() # 清空 不用传参
删中设置级联删除:
publish = models.ForeignKey(to=‘Publish‘, on_delete=models.CASCADE)
publish = models.ForeignKey(to=‘Publish‘, on_delete=models.SET_NULL, null=True) # 取消级联删除一定要设置null=True
CASCADE: 设置级联删除,即删除了出版社,对应的该出版社的书也会一块删除 SET_NULL: 取消级联删除
正向与反向的概念
models:
class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8, decimal_places=2) publist_date = models.DateField(auto_now_add=True) # publish = models.ForeignKey(to=‘Publish‘, to_field=‘id‘, on_delete=models.CASCADE,) publish = models.ForeignKey(to=‘Publish‘, on_delete=models.SET_NULL, null=True) authors = models.ManyToManyField(to=‘Author‘) # 虚拟字段 class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32) email = models.EmailField() # 对应就是varchar类型 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)
正向查询按字段,反向查询按表名小写...
一对一
正向:author---关联字段在author表里--->authordetail 按字段
反向:authordetail---关联字段在author表里--->author 按表名小写
查询jason作者的手机号 正向查询
查询地址是 :山东 的作者名字 反向查询
一对多
正向:book---关联字段在book表里--->publish 按字段
反向:publish---关联字段在book表里--->book 按表名小写_set.all() 因为一个出版社对应着多个图书
多对多
正向:book---关联字段在book表里--->author 按字段
反向:author---关联字段在book表里--->book 按表名小写_set.all() 因为一个作者对应着多个图书
查询出版社是东方出版社出版的书籍 一对多字段的反向查询
publish_obj = models.Publish.objects.filter(name=‘东方出版社‘).first()
print(publish_obj.book_set) # app01.Book.None
print(publish_obj.book_set.all())
查询作者jason写过的所有的书 多对多字段的反向查询
author_obj = models.Author.objects.filter(name=‘jason‘).first()
print(author_obj.book_set) # app01.Book.None
print(author_obj.book_set.all())
查询作者电话号码是110的作者姓名 一对一字段的反向查询
authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(authordetail_obj.author.name)
原文地址:https://www.cnblogs.com/qingqinxu/p/11260497.html