【Python】django模型models的外键关联使用
Python 2.7.10,django 1.8.6
外键关联:http://www.bubuko.com/infodetail-618303.html
字段属性:http://www.cnblogs.com/lhj588/archive/2012/05/24/2516040.html
过滤条件:http://www.douban.com/note/301166150/
django模型很强大,可以通过外键实现:
1、主表查询子表
2、子表查询主表
3、主表查询主表(多对多情况)
下面举例中表A、B都为models中的class,实际表名应该为“app_小写的classname”
获得的结果是字典,多个结果就是字典组成的列表,可以通过.__dict__['字典key']取出结果
上面三种关联查询的通用实现方法是:
A和B有关联字段,可以直接使用A表关联字段查询B表,例如
from appname.models import A, B B.objects.filter(a=?)
提示:
1、必须使用关联的字段作为条件,上面例子中a是表A与表B关联的字段名
2、反过来同样可以关联查询,例如A.objects.filter(b=?)
使用对象的子表_set方法:
假设A是主表,B是子表,可以使用
from appname.models import A, B object_a = A.objects.get(子表外键对应主表的字段)
object_a.b_set.all(条件)
提示:
1、从主表获得的对象查询子表时,方法一定要“小写子表名+_set”,或者在class中使用related_name定义主表对象查询子表时使用的方法名称。
例如子表字段:
class B(models.Model):
b_column_1 = models.ForeignKey(A, related_name = 'b')
2、主表获取对象必须要用get方法,但是条件不限制为对应关联字段
3、不能反向子表查询主表
4、多对多的关系要区分谁是主表谁是从表,也可以通过数据库中的表理解,如果多对多生成了中间表,中间表存在两个外键,那么只能通过顺序靠前的外键查询靠后的外键,不能反过来
django自带的模型例如auth中的user/group/permission可以修改,首先找到django安装路径,然后修改django/contrib/auth/models.py,比如新加表字段,然后执行命令同步到数据库中:
[root@test test1]# python manage.py makemigrations
[root@test test1]# python manage.py migrate
in除了__in语法也可以使用extra方法
model_a.objects.extra(where=['id IN (3, 4, 5, 20)'])
model支持group by及count/sum/max/mix等方法
from django.db.models import Count, Min, Max, Sum
#等价 select date,sum(data_length) as s from model_table group by date order by date
model_idl.objects.values('date').annotate(s=Sum('data_length')).order_by("-date")
使用外检的表join
参考:https://www.douban.com/note/301166150/
#name字段是外检关联字段,type是关联表的条件字段
相当于 select * from b join a on b.name=a.id where a.type=2 and b.status=0
model_b.objects.filter(status = 0, name__type__contains = 2)
另外models的update方法只能适用于filter获得的结果,get获取到的单个对象无法使用
单个对象可以使用:
object.属性= value
object.save()
【Python】django模型models的外键关联使用的更多相关文章
- Python sqlalchemy orm 多对多外键关联
多对多外键关联 注:使用三张表进行对应关联 实现代码: # 创建3个表 配置外键关联 # 调用Column创建字段 加类型 from sqlalchemy import Table, Column, ...
- python django中的orm外键级联删除
今天添加了一个路由表,路由表做外键,然后添加了几个组,路由表为组的外键,当我使用删除功能对路由表进行删除时,竞然将我的组也相当的删除了:尽管这是测试,但放到生产环境中还是会发生意外的:这个问题要解决: ...
- django admin编辑被外键关联的主表时支持显示字表记录
假设有模型 class A(models.Model): name = models.CharField() class B(models.Model): name = models.CharFiel ...
- pythonのsqlalchemy外键关联查询
#!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...
- Django框架----外键关联
app/models.py中: 创建班级表 class classes(models.Model): id = models.AutoField(primary_key=True) name = mo ...
- Python sqlalchemy orm 外键关联
创建外键关联 并通过relationship 互相调用 如图: 实现代码: import sqlalchemy # 调用链接数据库 from sqlalchemy import create_engi ...
- Python sqlalchemy orm 多外键关联
多外键关联 注:在两个表之间进行多外键链接 如图: 案例: # 创建两张表并添加外键主键 # 调用Column创建字段 加类型 from sqlalchemy import Integer, For ...
- Django(15)外键和表关系
外键删除操作 如果一个模型使用了外键.那么在对方那个模型被删掉后,该进行什么样的操作.可以通过on_delete来指定.可以指定的类型如下: CASCADE:级联操作.如果外键对应的那条数据被删除了, ...
- django 模型models
1. django 模型models 常用字段 1.models.AutoField 自增列 = int(11) 如果没有的话,默认会生成一个名称为 id 的列 如果要显式的自定义一 ...
随机推荐
- [Android Exception 1A] -com.android.volley.NoConnectionError: java.io.InterruptedIOException
- ::-/com.tongyan.tutelage W/System.err: com.android.volley.NoConnectionError: java.io.InterruptedIO ...
- PO_PO系列 - 采购单管理分析(案例)
2014-07-01 Created By BaoXinjian
- 树莓派学习:源码方式安装opencv
1:下载若干依赖项: 更新软件源:sudo apt-get update/upgrade; 依次安装一下依赖项: sudo apt-get install build-essential su ...
- 在win7电脑中如何查看运行进程的PID标识符
在介绍技巧方法之前,咱们还是先来介绍一下什么是PID标识符,这个PID标识符就是系统对运行中的程序自动分配的一个编号,是用来识别对应进程的,而且这个编号也是一一对应,不会有重复的,只有当系统结束运行的 ...
- [Swift]枚举
1. Swift的枚举的基本用法: 1) 和其它语言枚举的意义相同,就是用有限的一组值(不能是无限的)来表示一些特定的含义: 2) Swift使用关键字enum定义枚举类型,定义体中用case定义成员 ...
- Jenkins参数化构建
背景:每次构建项目时都需要去修改一下配置,然后保存,再去立即构建.这样修改容易修改出错误,影响到执行脚本,且每次都要去修改配置,不容易修改,操作也比较麻烦.所以决定将Jenkins修改为参数化构建.下 ...
- codeblocks安装后无法编译
codeblocks安装后无法编译: 解决办法: 1.下载自带编译器的codeblock安装包. 2.安装完后.修改配置 (1)打开软件,选择setting->Compiler (2)在编译器设 ...
- 一个类似bootstrap的foundation
提供了和BOOTSTRAP一样的功能,但明显比bootstrap有更好的效果 比如 <button> 直接就添加了样式了. http://www.foundcss.com/ Bootstr ...
- Java如何获取文件编码格式
1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原 ...
- 九度OJ1084
这道题一旦想开,其实思想十分简单的. 首先考虑n为奇数的情况,不难知f(n)=f(n-1).(只需要把n的所有拆分式-1即可……) 然后考虑n为偶数的情况,将拆分式划分为两种情况:一种是式子中带1的, ...