Django 多表操做

建立多表模型

​ 在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)
相關文章
相關標籤/搜索