Python - Django - ORM 外键操作
models.py:
from django.db import models # 出版社
class Publisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=64, null=False, unique=True) def __str__(self):
return "<Publisher object: {}>".format(self.name) # 书籍
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
publisher = models.ForeignKey(to="Publisher") def __str__(self):
return "<Book object: {}>".format(self.title)
publisher 中的内容:
book 表中的内容:
正向查询:
基于对象的查询:
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models book_obj = models.Book.objects.first() # 获取第一本书籍对象
ret = book_obj.publisher # 获取第一本书籍关联的出版社
print(ret)
ret_name = book_obj.publisher.name # 获取第一本书籍关联的出版社的 name 字段的内容
print(ret_name)
运行结果:
用下划线进行跨表查询:
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models ret = models.Book.objects.filter(id=1).values_list("publisher__name") # 查询 id 为 1 的出版社的 name 字段
print(ret)
运行结果:
反向查询:
基于对象的查询:
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models publisher_obj = models.Publisher.objects.get(id=2) # 获取 id 为 2 的出版社
ret_book = publisher_obj.book_set.all() # 获取所有该出版社的书籍,book_set 中的 book 是 Book 表的表名小写
ret_titles = ret_book.values_list("title") # 获取第二个出版社的所有书的书名
print(ret_titles)
运行结果:
可以在 Book 类中设置 related_name 来进行别名
修改 models.py 中的 Book 类
# 书籍
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
publisher = models.ForeignKey(to="Publisher", related_name="aaa") def __str__(self):
return "<Book object: {}>".format(self.title)
related_name 为 aaa,可以把 book_set 替换为 aaa
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models publisher_obj = models.Publisher.objects.get(id=2) # 获取 id 为 2 的出版社
ret_book = publisher_obj.aaa.all() # 获取所有该出版社的书籍,book_set 替换为 aaa
ret_titles = ret_book.values_list("title") # 获取第二个出版社的所有书的书名
print(ret_titles)
运行结果:
用下划线进行跨表查询:
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models ret = models.Publisher.objects.filter(id=2).values_list("book__title") # 获取 id 为 2 的出版社的所有书籍
print(ret)
运行结果:
可以在 Book 类中设置 related_name 来进行别名
修改 models.py 中的 Book 类
# 书籍
class Book(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=64, null=False, unique=True)
publisher = models.ForeignKey(to="Publisher", related_query_name="bbb") def __str__(self):
return "<Book object: {}>".format(self.title)
related_query_name 为 bbb,可以把 values_list 中的 book_title 替换为 bbb_title
orm.py:
import os if __name__ == '__main__':
# 加载 Django 项目的配置信息
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
# 导入 Django,并启动 Django 项目
import django
django.setup() from app01 import models ret = models.Publisher.objects.filter(id=2).values_list("bbb__title") # 获取 id 为 2 的出版社的所有书籍
print(ret)
运行结果:
Python - Django - ORM 外键操作的更多相关文章
- Django - orm外键操作
1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...
- Django(四) ORM 外键操作及初识Ajax
一.内容回顾 1.Django请求的生命周期: 路由系统 -> 视图函数(获取模板+数据 -> 渲染) -> 字符串返回给用户 2.路由系统: /index/ #-> 函数 ...
- django ORM 外键详解
Django中的外键: 首先,为了方便理解,我们把使用ForeignKey的字段所在的表定义为从表,把ForeignKey中to参数连接的表称为主表. 外键使用的先决条件: 在mysql数据表中,数据 ...
- Python sqlalchemy orm 外键关联
创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...
- django orm 外键id返回对应的名称
原文:https://blog.csdn.net/gghhm/article/details/99652143 当我们在写django的orm模块时,有时候会在用外键关联时,保存的是对应表中的id字段 ...
- Python - Django - ORM 多对多操作
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- DjangoORM外键操作
Django ORM 外键操作 经常修改的东西一般不放到内存里面,而是放到一张表里.表跟表之间是可以存在关系的,最基本的就是一对多的关系. models.ForeignKey(ColorDic) 1. ...
- djangoORM 修改表结构/字段/外键操作
Django支持修改表结构 把max_length=64 改为60 再执行一遍 python manage.py makemigrations python manage.py migrate 如果是 ...
- Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)
Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...
随机推荐
- native与H5优缺点及H5测试
一.native(原生)与H5优缺点介绍 native(原生)优点 1.运行速度快 2.可以应用到底层的API 3.便捷性与易用性 4.打开会比较节省流量 native(原生)缺点 1.不同操作系统需 ...
- Java - MyBites 逆向工程
逆向工程是什么呢? 说白了就是 mybatis 中提供了一个可以让你从 已经创建好的 数据库中,去通过表名,生成对应类,类属性和XML文件(sql语句). 源码:mybatis_AutoGenerat ...
- Mysql 根据时间取出每组数据中最新的一条
下策——查询出结果后将时间排序后取第一条 select * from a where create_time<="2017-03-29 19:30:36"order by c ...
- C++语言第一课的学习
// HelloApp.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include ...
- fread和fwrite和feof读写二进制文件
#include <stdio.h> #include <stdlib.h> void text_to_bin(char *argv[]); void bin_to_text( ...
- P1453 城市环路
题目背景 一座城市,往往会被人们划分为几个区域,例如住宅区.商业区.工业区等等.B市就被分为了以下的两个区域——城市中心和城市郊区.在着这两个区域的中间是一条围绕B市的环路,环路之内便是B市中心. 题 ...
- 64位内核开发第四讲,查看SSDT表与showSSDT表
目录 SSDt表与ShadowSSDT表的查看. 一丶SSDT表 1.什么是SSDT表 2.查看步骤 二丶ShadowSSDT表 1.什么是ShadowSSDT表 2.如何查看. 三丶工具介绍 SSD ...
- git添加公钥后报错sign_and_send_pubkey: signing failed: agent refused operation的解决办法
在服务器添加完公钥后报错 sign_and_send_pubkey: signing failed: agent refused operation 这个时候我们只要执行下 eval "$( ...
- +和join的区别
+ 每次进行相加都会开辟新的空间,回收旧的空间join 一次性开辟好空间,一次性添加进去,一次性回收
- Java查询目录下的所有文件(包括子目录)
目录图: 方法代码: /** * 读取目录下的所有文件 * * @param dir * 目录 * @param fileNames * 保存文件名的集合 * @return */ public st ...