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)

猜你喜欢

转载自www.cnblogs.com/xvchengqi/p/9953909.html