美文网首页Django入门开发实战
Django模型层之多表操作(三)

Django模型层之多表操作(三)

作者: 乔治大叔 | 来源:发表于2019-01-07 07:51 被阅读7次

    基于对象的跨表查询

    一对多查询(publish与book)

    正向查询(按字段:publish)
    # 查询主键为1的书籍的出版社所在的城市
    book_obj=Book.objects.filter(pk=1).first()
    # book_obj.publish 是主键为1的书籍对象关联的出版社对象
    print(book_obj.publish.city)
    反向查询(按表名:book_set)
    
    publish=Publish.objects.get(name="上海出版社")
    #publish.book_set.all() : 与上海出版社关联的所有书籍对象集合
    book_list=publish.book_set.all()    
    for book_obj in book_list:
           print(book_obj.title)
    
    # 一对多正向查询
        book=Book.objects.filter(name='红楼梦').first()
        print(book.publish)#与这本书关联的出版社对象
        print(book.publish.name)
        # 一对多反向查询
        # 人民出版社出版过的书籍名称
        pub=Publish.objects.filter(name='人民出版社').first()
        ret=pub.book_set.all()
        print(ret)
    

    一对一查询(Author 与 AuthorDetail)

    正向查询(按字段:authorDetail):
    
    egon=Author.objects.filter(name="egon").first()
    print(egon.authorDetail.telephone)
    反向查询(按表名:author):
    
    # 查询所有住址在北京的作者的姓名
     
    authorDetail_list=AuthorDetail.objects.filter(addr="beijing")
    for obj in authorDetail_list:
         print(obj.author.name)
    
    
    # 一对一正向查询
        # lqz的手机号
        lqz=Author.objects.filter(name='lqz').first()
        tel=lqz.author_detail.telephone
        print(tel)
        # 一对一反向查询
        # 地址在北京的作者姓名
        author_detail=AuthorDatail.objects.filter(addr='北京').first()
        name=author_detail.author.name
        print(name)
    

    多对多查询 (Author 与 Book)

    正向查询(按字段:authors):
    
    # 眉所有作者的名字以及手机号
     
    book_obj=Book.objects.filter(title="眉").first()
    authors=book_obj.authors.all()
    for author_obj in authors:
         print(author_obj.name,author_obj.authorDetail.telephone)
    反向查询(按表名:book_set):
    
    # 查询egon出过的所有书籍的名字
     
        author_obj=Author.objects.get(name="egon")
        book_list=author_obj.book_set.all()        #与egon作者相关的所有书籍
        for book_obj in book_list:
            print(book_obj.title)
    
    # 正向查询----查询红楼梦所有作者名称
        book=Book.objects.filter(name='红楼梦').first()
        ret=book.authors.all()
        print(ret)
        for auth in ret:
            print(auth.name)
        # 反向查询 查询lqz这个作者写的所有书
        author=Author.objects.filter(name='lqz').first()
        ret=author.book_set.all()
        print(ret)
    

    注意:

    你可以通过在 ForeignKey() 和ManyToManyField的定义中设置 related_name 的值来覆写 FOO_set 的名称。例如,如果 Article model 中做一下更改:

    publish = ForeignKey(Book, related_name='bookList')
    

    那么接下来就会如我们看到这般:

    # 查询 人民出版社出版过的所有书籍
     
    publish=Publish.objects.get(name="人民出版社")
    book_list=publish.bookList.all()  # 与人民出版社关联的所有书籍对象集合
    

    相关文章

      网友评论

        本文标题:Django模型层之多表操作(三)

        本文链接:https://www.haomeiwen.com/subject/qbtyrqtx.html