• 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)
    
  • 相关阅读:
    Intersection(计算几何)
    Happy Matt Friends(DP)
    Dire Wolf(区间DP)
    Black And White(DFS+剪枝)
    最大子矩阵
    Largest Rectangle in a Histogram (最大子矩阵)
    City Game(最大子矩阵)
    Zipper (DP)
    QQpet exploratory park(DP)
    C++程序设计(第4版)读书笔记_指针、数组与引用
  • 原文地址:https://www.cnblogs.com/xvchengqi/p/9953909.html
Copyright © 2020-2023  润新知