博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORM正向和反向查询
阅读量:6229 次
发布时间:2019-06-21

本文共 2363 字,大约阅读时间需要 7 分钟。

表结构

from django.db import models # Create your models here. class Publisher(models.Model):     id = models.AutoField(primary_key=True)     name = models.CharField(max_length=32) class Book(models.Model):     id = models.AutoField(primary_key=True)     name = models.CharField(max_length=32)     publisher = models.ForeignKey('Publisher', related_name='person_book', related_query_name='ooxx')

插入数据

# Book表 id   title  pubtime          person_id1    书1    1533225600000    12    书2    1533225600000    13    书3    1534435200000    14    书4    1535644800000    25    书5    1535126400000    3
# Publisher表 id   name    1    出版社1    2    出版社2    3    出版社3

正向查询: 外键所在表去查另一张表,Book >> Publisher

反向查询:普通表去查外键所在的表,Publisher >> Book

正向查询,基于对象跨表查询

book_obj = models.Book.objects.all()  # 取到书籍对象 book_obj.publisher.name   # 书籍的出版社名字,html book_obj.person.id   # 书籍的出版社id,html

跨表查询,利用双下划线跨表查询

models.Book.objects.filter(id=1).values('publisher__name')  # 查询id是1的书的出版社的名字,一条双下划线就是跨一张表 models.Book.objects.filter(id=1).values_list('publisher__name')

反向查询

对象查询  obj.表名_set()

publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象ret = publisher_obj.book_set.all()  # 找到第一个出版社出版的所有数for i in ret:  # 循环对象    print(i.name)  # 打印出每一个书的书名
publisher_obj = models.Publisher.objects.first()  # 找到第一个出版社对象books = publisher_obj.book_set.all()  # 找到第一个出版社出版的所有书titles = books.values_list("name")  # 找到第一个出版社出版的所有书的书名 print(titles) 因为使用了releted_name,就是用person_book代替了表字段名字 表字段person = models.ForeignKey(Person, related_name='person_book') 所以这一这样写 books = publisher_obj.person_book.all() titles = books.values_list('name') print(titles) 如果表字段person = models.ForeignKey(Person, related_name='person_book',related_query_name="xxoo") related_query_name="xxoo",这里表示跨表查询xxoo代替表的名字book books = publisher_obj.ooxx_set.all()

基于双下划线

ret = models.Publisher.objects.filter(id=1).values_list('person_book__name') person_book是通过releted_name给对应关系起的名字,通过person_book就找到了关联的表,再通过双下划线找到name print(ret)

附带django里面脚本的代码

import osif __name__ == '__main__':    # 加载Django项目的配置信息    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目名.settings")    # 导入Django,并启动Django项目    import django    django.setup()    from app01 import models    # 查询id为1的出版社出版的所有书的name    ret = models.Publisher.objects.filter(id=1).values_list('person_book__name')    print(ret)

 

转载于:https://www.cnblogs.com/aaronthon/p/9520832.html

你可能感兴趣的文章
互金启示录:流量思维的末路
查看>>
「镁客·请讲」镁伽机器人黄瑜清:有需求没供给,协作机器人市场存在“两极现象”...
查看>>
GoPro 研发无人机意欲如何?
查看>>
Ubuntu 16.04清楚Dash历史记录
查看>>
随机生成数的方法
查看>>
Oracle APEX 系列文章5:在阿里云上打造属于你自己的APEX完整开发环境 (进一步优化)...
查看>>
大型分布式C++框架《二:大包处理过程》
查看>>
携手科技出版巨擎 推动中国IT人才成长 51CTO与人民邮电出版社达成战略合作
查看>>
11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump
查看>>
WCF序列化
查看>>
uCos-III移植到STM32F10x
查看>>
Centos下源码包安装lamp常见的几个小问题
查看>>
angularjs-过滤输入filter
查看>>
angularjs-过滤输入filter
查看>>
RAC 环境下的重要参数
查看>>
你知道,人工智能如何增强数据中心的安全性
查看>>
苗圩:从国家战略高度加快推进智能网联汽车发展
查看>>
团队如何进行Code Review
查看>>
中国联通开展多场景蜂窝车联网业务示范
查看>>
1星|《追随》:洞察力太差,有效信息太少,咨询经验太少(举的例子以跟自己孩子的互动为主)...
查看>>