08 Django -- ORM 多表操作
多表查询
admin:
输入:createsuperuser,配置账户密码
admin.py文件下注册表:
admin.site.register
增加
一对一:
Author------>AuthorDetail
方式1: 关联字段名 = 数据
方式2: 关联属性=对象(另一张表对应的model对象)
author_detail_obj=models.AuthorDetail.objects.get(id=4)
models.Author.objects.creater(
name='alex',
age=18
auth_id=4 # 方式一,4是AuthorDetail中的id
# auth=author_detail_obj # 方式二
)
多对一:
Book------->Publish
pub_obj = models.Publish.objects.get(id=4)
models.Book.objects.create(
title='xxx',
publishDate='2011-11-11',
price=100,
publishs_id=3, # 方式一
publishs=pub_obj # 方式二
)
多对多:
Book------>Author
通过authors属性操作第三张表。
book_obj.authors.add(1,3)
# 或者:
book_obj.authors.add(*[1,3])
# 书是由id=1和id=3的作者编写的
# authors是关联属性
# 也可通过add添加对应作者的对象(同上)
删除: 级联
一对一
models.Author.objects.filter(id=3).delect()
多对一
models.Book.objects.filter(id=3).delect()
多对多:
通过关联属性操作第三张表
book_obj = models.Book.objects.get(id=2) # 书籍id=2
book_obj.authors.remove(1) # 删除id=1的作者的关系
book_obj.authors.clear() # 清除 id=2书籍对应的所有作者关系
book_obj.authors.set(['1','3']) # 先清除后添加 id=1,id=3的作者
改
models.Book.objects.filter(id=2).update(
title='ooo',
publishs_id=1
)
正向查询与反向查询:
关系属性(字段)写在哪个类(表)里面,当从当前类(表)的书籍去查询它关联的类(表)的数据时,称正向查询。反之为反向查询。
查询:
一对一:
正向查询:依靠关联属性名称
Author---->AuthorDetail
# 查询 alex 的手机号码
author_obj = models.Author.objects.filter(name='alex')
print(author_obj.authors.telephone)
# authors是关联属性名称
反向查询:依靠关联类名(小写)
AuthorDetail---->Author
# 查询110这个电话号是谁的
author_detail_obj=models.AuthorDetail.objects.get(telephone='110')
print(author_detail_obj.author.name)
# author是Author类名的小写
多对一
正向查询: 依靠关联属性名称
Book------>Publish
# 查询一下 xxx 这本书的出版社
book_obj = models.Book.objects.get(title='xxx')
print(book_obj.publishs.name)
# publishs是关联属性名称
反向查询: 依靠关联类名小写_set
Publish------>Book
# 查询 人民出版社 出版了那些书
pub_obj = models.Publish.objects.get(name='人民出版社')
print(pub_obj.book_set.all()) # 返回QuerySet类型
# book_set是Book小写+_set
多对多
正向查询:依靠关联属性名称
Book---->Author
# 查看 xxx 这本书的作者是谁
book_obj=models.Book.objects.get(title='xxx')
print(book_obj.authors.all())
#authors是多对多关联属性名称
反向查询:
Author---->Book
# 查看 alex 写了那些书
author_obj = models.Author.objects.filter(name='alex')
print(author_obj.book_set.all())
# book_set是Book小写+_set
admin系统
admin注册
admin.py文件
from django.contrib import admin
# Register your models here.
from app01 import models
admin.site.register(models.Author)
admin.site.register(models.AuthorDetail)
admin.site.register(models.Publish)
admin.site.register(models.Book)
admin添加用户
python manage.py createsuperuser
输入用户名:yan
邮箱不用输 直接回车
输入密码:必须超过8位,并且别太简单