day-71Django补充

orm真实存在的字段名与虚拟字段名

   book_obj = models.Book.objects.filter(pk=1).first()
    book_obj.publish_id = 3          # 点表中真实存在的字段名
    book_obj.save()
publish_obj
= models.Publish.objects.filter(pk=2).first() book_obj.publish = publish_obj     # 点orm中字段名 传该字段对应的表的数据对象 book_obj.save()

orm中既可以使用真实存在字段名来进行增删改查,

也可以通过虚拟字段后面跟上虚拟字段外键表的数据对象,来进行增删改查,本质这个对象就是外键表数据的id,虚拟字段对应的就是表中的真实字段(如:user_id)

ORM中对象点的正反查询

                                                      #多对多字段的反向查询
     author_obj = models.Author.objects.filter(name='jason').first()
     print(author_obj.book_set)                          # app01.Book.None
     print(author_obj.book_set.all())

                                                          #一对一字段的反向查询
     authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
     print(authordetail_obj.author.name)

正向查询点虚拟字段名,

当查询的结果为一个对象时不需要加all()(出现于一对一)

当查询的结果为多个对象时需要加all(),也就是列表里面套对象,不然会报错(# app01.Author.None)(出现于一对多,多对多)

反向查询点要查的表名小写

当查询的结果为一个对象时:

  要查的表名小写,且不需要加all()(出现于一对一)

当查询的结果为多个对象时:

  要查的表名小写_set.all()),也就是列表里面套对象,不然会报错(# app01.Author.None)(出现于一对多,多对多)

ORM中双下划线的正反查询

    res = models.Book.objects.filter(title='三国演义').values('authors__authordetail__phone')     #先正向在反向,接着是反向中的列名
     print(res)

正向查询:

  虚拟字段__虚拟字段对应表的列名

反向查询:

  表名小写__表中的列名

 ···查询出版社为东方出版社的所有图书的名字和价格
    # 正向
     res = models.Publish.objects.filter(name='东方出版社').values('book__title','book__price')
     print(res)
    # 反向
     res = models.Book.objects.filter(publish__name='东方出版社').values('title','price')
     print(res)

正向查询(思路):

  以出版社为基表查询

反向查询(思路):

  以书为基表查询

注意:

  数据的增删改查都是按基表来

  book__price__gt=400(书的价格大于400)

猜你喜欢

转载自www.cnblogs.com/klw1/p/11269206.html