在settings内配置好databasepython
在项目下的models内建立表的模型mysql
class Publish(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) addr = models.CharField(max_length=64) email = models.EmailField() class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) sex = models.IntegerField() authordetail = models.OneToOneField(to='AuthorDetail', to_field='id') class AuthorDetail(models.Model): id = models.AutoField(primary_key=True) phone = models.CharField(max_length=32) addr = models.CharField(max_length=64) class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) publish = models.ForeignKey(to='Publish', to_field='id') authors = models.ManyToManyField(to='Author')
在项目文件夹下的_ _ init _ _.py文件内写入git
import pymysql pymysql.install_as_MySQLdb()
再在命令窗口内输入sql
python3 manage.py makemigrations数据库
python3 manage.py migratecode
一对多新增数据 #添加一本北京出版社出版的书 #第一种方式 ret=Book.objects.create(name='红楼梦',price=34.5,publish_id=1) print(ret.name) #第二种方式,存对象publish=出版社的对象,存到数据库,是一个id publish=Publish.objects.get(id=1) #pk是主键,经过主键查找 publish=Publish.objects.get(pk=1) publish = Publish.objects.filter(pk=2).first() ret = Book.objects.create(name='西游记', price=34.5, publish=publish) print(ret.name)
book=Book.objects.get(pk=1) # book.publish=出版社对象 book.publish_id=2 book.save() #方式二 book=Book.objects.filter(pk=1).update(publish=出版社对象) book=Book.objects.filter(pk=1).update(publish_id=1)
#为红楼梦这本书新增一个叫layer,dzg的做者 lqz=Author.objects.filter(name='layer').first() egon=Author.objects.filter(name='dzg').first() book=Book.objects.filter(name='红楼梦').first() # add 添加多个对象 book.authors.add(layer,dzg) #add添加做者id book.authors.add(1,2) #删除 remove,能够传对象,能够传id,能够传多个,不要混着用 book.authors.remove(layer) book.authors.remove(2) book.authors.remove(1,2) #clear清空全部 book.authors.clear() #set,先清空,在新增,要传一个列表,列表内能够是, id,也能够是对象 book.authors.set([layer,]) #这样不行,由于它打散了传过去了,至关于book.authors.set(lqz) book.authors.set(*[layer,])
正向 author---关联字段在author--->authordetail ------> 按字段
反向 authordetail------关联字段在author--->author -----> 按表名小写对象
#查询layer做者的手机号 正向查询 author=Author.objects.filter(name='layer').first() # author.authordetail 就是做者详情的对象 authordetail=author.authordetail print(authordetail.phone) #查询地址是 :山东 的做者名字 反向查询 authordetail=AuthorDetail.objects.filter(addr='山东').first() # authordetail.author 这是做者对象 author=authordetail.author print(author.name)
正向 book---关联字段在book--->publish ------> 按字段
反向 publish------关联字段在book--->book -----> 按表名小写_set.all()ci
#正向 查询红楼梦这本书的出版社邮箱 book=Book.objects.filter(name='红楼梦').first() # book.publish 就是出版社对象 pulish=book.publish print(pulish.email) #反向 查询地址是北京 的出版社出版的图书 publish=Publish.objects.filter(addr='北京').first() # publish.book_set.all() 拿出全部的图书 books=publish.book_set.all() # 统计一下条数 books=publish.book_set.all().count() print(books)
正向 book---关联字段在book--->author ------> 按字段.all()
反向 author------关联字段在book--->book -----> 按表名小写_set.all()rem
#查询红楼梦这本书全部的做者 book=Book.objects.filter(name='红楼梦').first() book.authors.all() #是全部的做者,是一个queryset对象,能够继续点 print(book.authors.all()) #查询layer写的全部书 lqz=Author.objects.filter(name='layer').first() books=lqz.book_set.all() print(books) #连续跨表 #查询红楼梦这本书全部的做者的手机号 book=Book.objects.filter(name='红楼梦').first() authors=book.authors.all() for author in authors: authordetail=author.authordetail print(authordetail.phone)
#一对一 #查询layer做者的手机号 正向查询 跨表的话,按字段 #以author表做为基表 ret=Author.objects.filter(name='layer').values('authordetail__phone') print(ret) #以authordetail做为基表 反向查询,按表名小写 跨表的话,用表名小写 ret=AuthorDetail.objects.filter(author__name='layer').values('phone') print(ret) #查询layer这个做者的性别和手机号 #正向 ret=Author.objects.filter(name='layer').values('sex','authordetail__phone') print(ret) #查询手机号是13888888的做者性别 ret=Author.objects.filter(authordetail__phone='13888888').values('sex') print(ret) ret=AuthorDetail.objects.filter(phone='13888888').values('author__sex') print(ret)