django之多表查询与创建

https://www.cnblogs.com/liuqingzheng/articles/9499252.html

 # 一对多新增数据
    添加一本北京出版社出版的书
    第一种方式
    ret=Book.objects.create(name=‘红楼梦‘,price=34.5,publish_id=1)
    print(ret.name)
    第二种方式,存对象publish=出版社的对象,存到数据库,是一个id
    publish=Publish.objects.get(id=1)
    pk是主键,通过主键查找
    publish=Publish.objects.get(pk=1)
    publish = Publish.objects.filter(pk=2).first()
    ret = Book.objects.create(name=‘西游记‘, price=34.5, publish=publish)
    print(ret.name)
    一对多修改数据
    book=Book.objects.get(pk=1)
    # book.publish=出版社对象
    book.publish_id=2
    book.save()
    # 方式二
    book=Book.objects.filter(pk=1).update(publish=出版社对象)
    book=Book.objects.filter(pk=1).update(publish_id=1)
    多对多新增
    为红楼梦这本书新增一个叫lqz,egon的作者
    lqz=Author.objects.filter(name=‘lqz‘).first()
    egon=Author.objects.filter(name=‘egon‘).first()
    book=Book.objects.filter(name=‘红楼梦‘).first()
    # add 添加多个对象
    book.authors.add(lqz,egon)
    add添加作者id
    book.authors.add(1,2)
    删除 remove,可以传对象,可以传id,可以传多个,不要混着用
    book.authors.remove(lqz)
    book.authors.remove(2)
    book.authors.remove(1,2)
    clear清空所有
    book.authors.clear()
    set,先清空,在新增,要传一个列表,列表内可以是, id,也可以是对象
    book.authors.set([lqz,])
    ********这样不行,因为它打散了传过去了,相当于book.authors.set(lqz)
    book.authors.set(*[lqz,])

    lqz=Author.objects.filter(name=‘lqz‘)
    print(type(lqz))
    from  django.db.models.query import QuerySet
# ***************************基于对象的跨表查询
    ‘‘‘
    一对一
    正向   author---关联字段在author--->authordetail   ------>  按字段
    反向   authordetail------关联字段在author--->author  -----> 按表名小写

    ‘‘‘
    查询lqz作者的手机号   正向查询
    author=Author.objects.filter(name=‘lqz‘).first()
    # author.authordetail 就是作者详情的对象
    authordetail=author.authordetail
    print(authordetail.phone)
    查询地址是 :山东 的作者名字   反向查询
    authordetail=AuthorDetail.objects.filter(addr=‘山东‘).first()
    # authordetail.author  这是作者对象
    author=authordetail.author
    print(author.name)

    #一对多
    ‘‘‘
    一对多
    正向   book---关联字段在book--->publish   ------>  按字段
    反向   publish------关联字段在book--->book  -----> 按表名小写_set.all()
    ‘‘‘
    正向 查询红楼梦这本书的出版社邮箱
    book=Book.objects.filter(name=‘红楼梦‘).first()
    # book.publish  就是出版社对象
    pulish=book.publish
    print(pulish.email)
    反向  查询地址是北京 的出版社出版的图书
    publish=Publish.objects.filter(addr=‘北京‘).first()
    # publish.book_set.all()  拿出所有的图书
    books=publish.book_set.all()
    # 统计一下条数
    books=publish.book_set.all().count()
    print(books)

    ‘‘‘
    多对多
    正向   book---关联字段在book--->author   ------>  按字段.all()
    反向   author------关联字段在book--->book  -----> 按表名小写_set.all()
    ‘‘‘
    #查询红楼梦这本书所有的作者
    book=Book.objects.filter(name=‘红楼梦‘).first()
    book.authors.all()  #是所有的作者,是一个queryset对象,可以继续点
    print(book.authors.all())

    查询lqz写的所有书
    lqz=Author.objects.filter(name=‘lqz‘).first()
    books=lqz.book_set.all()
    print(books)

    连续跨表
    查询红楼梦这本书所有的作者的手机号
    book=Book.objects.filter(name=‘红楼梦‘).first()
    authors=book.authors.all()
    for author in authors:
        authordetail=author.authordetail
        print(authordetail.phone)

    # ****************************基于对象的查询---是子查询也就是多次查询
    # ***************基于双下划线的查询*****
    # 一对一
    查询lqz作者的手机号   正向查询  跨表的话,按字段
    以author表作为基表
    ret=Author.objects.filter(name=‘lqz‘).values(‘authordetail__phone‘)
    print(ret)
    以authordetail作为基表 反向查询,按表名小写  跨表的话,用表名小写
    ret=AuthorDetail.objects.filter(author__name=‘lqz‘).values(‘phone‘)
    print(ret)
    查询lqz这个作者的性别和手机号
    正向
    ret=Author.objects.filter(name=‘lqz‘).values(‘sex‘,‘authordetail__phone‘)
    print(ret)
    查询手机号是13888888的作者性别
    ret=Author.objects.filter(authordetail__phone=‘13888888‘).values(‘sex‘)
    print(ret)
    ret=AuthorDetail.objects.filter(phone=‘13888888‘).values(‘author__sex‘)
    print(ret)

原文地址:https://www.cnblogs.com/zhaijihai/p/9954695.html

时间: 2024-08-02 18:05:59

django之多表查询与创建的相关文章

Django的ORM表查询

目录 Django的ORM表查询 单表查询 多表查询 聚合查询 分组查询 F与Q查询 Django的ORM表查询 先创建一个数据库,做前期准备 为了方便测试,不再进行urls对应关系和views的书写,直接测试的单个文件 那么如何只单独测试Django中的某个py文件,有以下方法 在任意一个py文件中书写以下代码 可以在应用app的目录下的tests.py中书写 也可以自己建立一个py文件书写 import os if __name__ == "__main__": os.enviro

Django开发之路 二(django的models表查询)

django的models表查询 一.单表查询 (1) all(): 查询所有结果 # 返回的QuerySet类型 (2) filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 #返回的QuerySet类型 (3) get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, #返回的models对象 如果符合筛选条件的对象超过一个或者没有都会抛出错误. (4) exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 #返回的Query

Django 之多表查询 与多表的使用

1.django的多表查询 主要区分为: 正向查询    逆向查询 1. 多表查询: 是一个复杂的查询,他分为对象查询和__模糊查询两种方式 2. 多表查询: 又分为 一对一查询, 一对多查询, 多对多查询 三种方式 3. 多表查询: 分为正向查询 与 逆向查询, 正向查询 是根据 这个表中的外键属性名开始出发查询的跨表查询 逆向查询 是根据 根据关联表的 类名 小写 开始 进行跨表查询 4. 多表查询: 外键的存放位置如下: # 一对多:出版社(一) 书籍(多,外键在多的一方,依赖于出版社)

Django之跨表查询及添加记录

一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);     一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many). 创建一对一的关系:OneToOne("要绑定关系的表名") 创建一对多的关系:ForeignKey("要绑定关系的表名") 创建多对多的关系:ManyToMany("要绑定关系的表名"

django orm 关联表查询

django orm 关联表数据,即sql的多表查询 例如两个表: Apply表中定义了字段position为foreignkey指向job表的id字段, 1.通过job表查找子表apply的字段信息: job.objects.values( 'id', 'job_type', 'apply__date_created') 连接符为小写的子表tablename+双下线+子表字段名即:apply__date_created 表示寻找Apply表中的date_created字段 等价于后台的SQL:

django之多表查询操作

基于双下划线的跨表查询(连表查询 join) select emp.name from emp inner join dep on emp.dep_id = dep.id where dep.name='技术'; select emp.name from dep inner join emp on emp.dep_id = dep.id where dep.name='技术'; 示例: # 一对一 # 查询一下王洋的电话号码 # ret = models.Author.objects.filte

Django之跨表查询——正反向查询(ForeignKey)

1.正向查询和反向查询: 外键的查询操作: 正向查询: # 正向查询 # 基于对象,跨表查询 book_obj = models.Book.objects.all().first() ret = book_obj.publisher # 和我这本书关联的出版社对象 print(ret,type(ret)) ret = book_obj.publisher.name # 和我这本书关联的出版社对象的name属性 print(ret,type(ret)) # 查询id=1的书出版社名称 # 涉及到跨

Django models 单表查询

从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet 1. 查看Django QuerySet执行的SQL .query.__str__()或 .query属性打印执行的sql语句 from quicktool.models import User from django.http import HttpResponse Creat = User.objects.all().filter(created=1557222940).query.__str__() return Ht

Django中多表查询思路

需求: 1.有一张文章表和一张评论表 2.两张表的关系是一对多 3.规则:若是有新评论,则将对应的文章置顶,若是有新文章则将新文章置顶. 思路: 在文章表中增加一个最后评论时间的字段.然后采用分组排序,即可解决 预留: Django中除了有外键对应关系表外,如何将多张表联合查询?