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)