python——Django(ORM连表操作)
千呼万唤始出来~~~当当当,终于系统要写django的ORM操作啦!!!这里记录的是django操作数据库表一对多、多对多的表创建及操作。对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因为能查到就可以用常规方法进行修改,怎么加进来就怎么删掉,都是大同小异,就不再赘述了~~~
一对多
class UserType(models.Model):
caption = models.CharField(max_length=32) class UserInfo(models.Model):
user_type = models.ForeignKey(UserType)# user_type对象中封装id,caption
username = models.CharField(max_length=32)
age = models.IntegerField()
增:
1.外键id添加
models.UserInfo.objects.create(username='Eva_J',age=18,user_type_id=1)
2.直接添加外键的对象
obj = models.UserType(caption='test')
obj.save()
models.UserInfo.objects.create(username='Eva_J',age=18,user_type=obj)
查:
正向查询:根据userinfo查usertype
result = models.UserInfo.objects.filter(user_type__caption='CEO')
for item in result:
print item.username,item.age,item.user_type.caption
反向查询:根据usertype查userinfo
result = models.UserType.objects.get(id=1)
print '-->0',result
print '-->1',result.userinfo_set
print '-->2',result.userinfo_set.all()
print '-->3',result.userinfo_set.filter(username='eva') #用字段条件查询
print '-->4',models.UserInfo.objects.filter(user_type=result) #用对象条件查询 user_type_obj = models.UserType.objects.get(userinfo__username='eva')
print '-->0',user_type_obj.caption
print '-->1',user_type_obj.userinfo_set.all().count()
return HttpResponse('ok')
多对多
class Host(models.Model):
hostname = models.CharField(max_length=32)
port = models.IntegerField() class HostAdmin(models.Model):
username = models.CharField(max_length=32)
email = models.CharField(max_length=32)
host = models.ManyToManyField(Host)
增:
正向增:
admin_obj = models.HostAdmin.objects.get(username='alex')
host_list = models.Host.objects.filter(id__lt=3)
admin_obj.host.add(*host_list)
反向增:
host_obj = models.Host.objects.get(id=3)
admin_list= models.HostAdmin.objects.filter(id__gt=1)
host_obj.hostadmin_set.add(*admin_list)
区别总结:区别在于正向查拥有自己创建好的host句柄,可以直接使用add方法添加,而反向查没有,所以要使用django为我们提供的set句柄。

查:
#正向查
admin_obj = models.HostAdmin.objects.get(username='alex')
print admin_obj.host.all()
#反向查
host_obj = models.Host.objects.get(id=3)
print host_obj.hostadmin_set.all()
class Host1(models.Model):
hostname = models.CharField(max_length=32)
port = models.IntegerField() class HostAdmin1(models.Model):
username = models.CharField(max_length=32)
email = models.CharField(max_length=32)
host = models.ManyToManyField(Host1,through='HostRelation') class HostRelation(models.Model):
host =models.ForeignKey(Host1)
admin =models.ForeignKey(HostAdmin1)
自定义多对多表创建
#增
#models.HostRelation.objects.create(host_id=1,admin_id=1)
#查
relationList = models.HostRelation.objects.all()
for item in relationList:
print item.host.hostname
print item.admin.username
自定义多对多表操作
其他(selecte_related && query):
select_related是用来为连表查询做优化的,我们在查询外键关联的表的时候,都应该使用select_related,这样,只需要执行一条命令就可以把相关的字段都查到了。下面就来看看select_related的作用吧~
例:
class UserType(models.Model):
caption = models.CharField(max_length=32)
def __unicode__(self):
return self.caption class UserInfo(models.Model):
user_type = models.ForeignKey(UserType)# user_type对象中封装id,caption
username = models.CharField(max_length=32)
age = models.IntegerField()
def __unicode__(self):
return self.username
表结构
python代码:
result = models.UserInfo.objects.all()
result_sr = models.UserType.objects.select_related().all()
print result.query
print result_sr.query
生成的sql:
SELECT "app01_userinfo"."id", "app01_userinfo"."user_type_id", "app01_userinfo"."username", "app01_userinfo"."age" FROM "app01_userinfo"
SELECT "app01_usertype"."id", "app01_usertype"."caption" FROM "app01_usertype"
这里顺便再介绍一下query方法,可以获取到django为我们生成的sql内容~就是这么炫酷!
其他(F和Q):
未完待续......
python——Django(ORM连表操作)的更多相关文章
- Django ORM 多表操作
目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...
- Django ORM多表操作
多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...
- Python - Django - ORM 自定义表名
通过 Django 建立的表 命名方式为:项目名_表名 可以将该默认命名方式进行修改 models.py: from django.db import models class Person(mode ...
- django ORM单表操作
1.ORM介绍 ORM是“对象-关系-映射”的简称 映射关系: mysql---------Python 表名----------类名 字段----------属性 表记录--------实例化对象 ...
- Python - Django - ORM 一对一表结构
当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,可以把不怎么常用的字段 单独拿出来做成一张表,然后用一对一的表关联起来 这样既保证数据都完整的保存下来,又能保证检索更快 model ...
- Python - Django - ORM 多对多操作
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- Python - Django - ORM 外键操作
models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...
- Django框架06 /orm多表操作
Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- django框架基础-ORM单表操作-长期维护
############### 单表操作-添加数据 ################ import os if __name__ == '__main__': os.environ.set ...
随机推荐
- 忘记mysql root密码的解决方法
一. MySQL密码的恢复方法一 有可能你的系统没有 safe_mysqld 程序(比如我现在用的 ubuntu操作系统, apt-get安装的mysql) , 下面方法可以恢复 1. 停止mysql ...
- 怎么通过 Mysql 实现数据同步呢?
怎么使 mysql 数据同步先假设有主机 A 和 B ( linux 系统),主机 A 的 IP 分别是 1.2.3.4 (当然,也可以是动态的),主机 B 的 IP 是 5.6.7.8 .两个主机都 ...
- busybox的编译、使用及安装
转载于:http://blog.sina.com.cn/wyw1976 busybox是什么? (1)busybox是Linux上的一个应用程序(application),即只有一个ELF文件头. ( ...
- Logstash学习-Hello World
1.安装 rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearchcat > /etc/yum.repos.d/l ...
- RK3288 GPIO 输出问题
cat /sys/kernel/debug/gpio cat /proc/bus/input/devices #define GPIO_BANK0 (0 << R ...
- #region Json转DataTable
#region Json转DataTable private DataTable Json2Dtb(string json) { JavaScrip ...
- 个人作业-Week3
个人作业-Week3 1. 软件工程师的成长 同学们在上这门课的时候,还是大三,你的困难和迷茫,别人一定有过.请看看别人怎么学习的,有些是科班,有些是野路子,有些成功,有些失败. 请读完下面所有博客( ...
- 读书笔记:《HTML5开发手册》
一.HTML5中新的结构元素 1. HTML5初始文件 1.1.doctype 在之前,doctype的声明是这样的: <!DOCTYPE HTML PUBLIC "-//W3C//D ...
- python之SQLAlchemy
ORM介绍 orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为 ...
- Java 动态生成复杂 Word
Java 动态生成复杂 Word 阅读目录 1. 制作 Word 模版,将你需要动态生成的字段用${}替换.2. 将 Word文档保存为 xml .3. 引入项目. 项目中需要用 java 程序生成d ...