在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)