DAY77-Django框架
Posted xvchengqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAY77-Django框架相关的知识,希望对你有一定的参考价值。
今日内容:创建多表模型、多表数据操作、基于对象的跨表查询、基于双下划线的跨表查询
一、创建多表模型
class Author(models.Model):
# id如果不写,会自动生成,名字叫nid,并且自增
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
sex = models.IntegerField()
#一对一的关系:OneToOneField(to=‘表名‘,to_field=‘主键‘)
#OneToOneField相当于ForeignKey(unique=True),唯一性约束,但是会报警告,不建议用
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 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 Book(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=6,decimal_places=2)
#一对多的关系:ForeignKey(to=‘表名‘,to_field=‘主键‘)
publish = models.ForeignKey(to=‘Publish‘,to_field=‘id‘)
#多对多的关系:ManyToManyField会自动创建第三张表
authors = models.ManyToManyField(to=‘Author‘)
二、多表数据操作
一对多
#添加数据
#方式一
book = models.Book.objects.create(name=‘三国演义‘,price=25.89,publish_id=1)
#方式二,存对象
#pk是指主键,id不一定是主键。
publish = models.Publish.objects.filter(pk=1).first()
book = models.Book.objects.create(name=‘金瓶‘,price=69.96,publish=publish)
#删除数据
#操作与单表一样
#修改数据
#与添加一样
#方式一
book=Book.objects.filter(pk=1).update(publish=出版社对象)
book=Book.objects.filter(pk=1).update(publish_id=1)
#方式二
book=Book.objects.get(pk=1)
book.publish=出版社对象 | book.publish_id=2
book.save()
多对多
author1 = models.Author.objects.get(name=‘小明‘)
author2 = models.Author.objects.get(name=‘小红‘)
book = models.Book.objects.get(name=‘红楼梦‘)
#add:添加数据
#方法一:添加作者对象
book.authors.add(author1,author2)
#方法二:添加作者ID
book.authors.add(1,2)
#remove:删除数据,可以删除一个或多个
#方法一:删除作者对象
book.authors.remove(author2)
#方法二:删除作者ID
book.authors.remove(1)
#clear:清空对象中的所有
book.authors.clear()
#set:先清空,在新增,要传一个列表,列表内可以是, id,也可以是对象,但是不要混用
book.authors.set([2,3])
三、基于对象的跨表查询
一对一
#正向:关联字段在哪里,从哪里开始就是正向。正向查询按字段
#查询小明作者的手机号
author = models.Author.objects.filter(name=‘小明‘).first()
authordetail = author.authordetail#authordetail是字段名
print(authordetail.phone)
#反向:反向查询按表名小写
#查询地址是北京的作者名字
authordetail = models.AuthorDetail.objects.filter(addr=‘北京‘).first()
author = authordetail.author#author是表名
print(author.name)
一对多
#正向:正向查询按字段
# 查询红楼梦这本书的出版社邮箱
book = models.Book.objects.filter(name=‘红楼梦‘).first()
publish = book.publish
print(publish.email)
#反向:反向按表名小写_set.all()
# 查询地址是北京 的出版社出版的图书
publish = models.Publish.objects.filter(addr=‘北京‘).first()
book = publish.book_set.all()
print(book)
多对多
#正向:正向查询按字段.all()
#查询红楼梦这本书所有的作者
book = models.Book.objects.filter(name=‘红楼梦‘).first()
author = book.authors.all()
print(author)
#反向查询:反向按表名小写_set.all()
#查询小明写的所有书
author = models.Author.objects.filter(name=‘小明‘).first()
book = author.book_set.all()
print(book)
注:基于对象的查询,其本质就是多次查询(子查询)
四、基于双下划线的跨表查询
一对一
#正向:关联字段在哪里,从哪里开始就是正向。正向查询按字段
#查询小明作者的手机号
phone = models.Author.objects.filter(name=‘小明‘).values(‘authordetail__phone‘)
print(phone)
#反向:反向查询按表名小写
#查询地址是北京的作者名字
name = models.AuthorDetail.objects.filter(addr=‘北京‘).values(‘author__name‘)
print(name)
以上是关于DAY77-Django框架的主要内容,如果未能解决你的问题,请参考以下文章
text 来自Codyhouse框架的Browserlist片段源代码