千呼万唤始出来~~~当当当,终于系统要写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连表操作)的更多相关文章

  1. Django ORM 多表操作

    目录 Django ORM 多表操作 表模型 表关系 创建模型 逆向到表模型 插入数据 ORM 添加数据(添加外键) 一对多(外键 ForeignKey) 一对一 (OneToOneFeild) 多对 ...

  2. Django ORM多表操作

    多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对 ...

  3. Python - Django - ORM 自定义表名

    通过 Django 建立的表 命名方式为:项目名_表名 可以将该默认命名方式进行修改 models.py: from django.db import models class Person(mode ...

  4. django ORM单表操作

    1.ORM介绍 ORM是“对象-关系-映射”的简称 映射关系: mysql---------Python 表名----------类名 字段----------属性 表记录--------实例化对象 ...

  5. Python - Django - ORM 一对一表结构

    当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,可以把不怎么常用的字段 单独拿出来做成一张表,然后用一对一的表关联起来 这样既保证数据都完整的保存下来,又能保证检索更快 model ...

  6. Python - Django - ORM 多对多操作

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  7. Python - Django - ORM 外键操作

    models.py: from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(p ...

  8. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

  9. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

  10. django框架基础-ORM单表操作-长期维护

    ###############    单表操作-添加数据    ################ import os if __name__ == '__main__': os.environ.set ...

随机推荐

  1. [SQL入门级] 上篇被移出园子首页,那这篇咱就'薄利多销'

    这个系列的博文知识回顾sql知识作的记录,温故而知新.上一篇内容达不到知识分享的层级被移出园子首页,对不住各位看官,内容简单了些.下面咱就记录多一些的基础知识,薄利多销: 控制用户权限 • 创建用户 ...

  2. Mac OS下基于Eclipse的Android调试环境搭建

    1.安装Eclipse:http://www.eclipse.org/downloads/,网页会自动检测适用的版本(Mac OS x64),下载“Eclipse IDE for java Devel ...

  3. [转]SSAS没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG)) (Microsoft Visual Studio)的解决办法

    转自:http://www.cnblogs.com/xvqm00/archive/2011/07/15/2107338.html 打开SSAS 数据源视图浏览数据时,提示 没有注册类别 (异常来自 H ...

  4. mysql 主命令总结

    mysql 登录和恢复命令 mysqladmin 管理 mysql 命令 mysqldump 备份命令 mysqlbinlog 解析 binlog 命令 source 恢复数据命令

  5. linux的mount(挂载)命令详解

    本文介绍mount命令的用法,以及技巧光盘镜像文件.移动硬盘及U盘的方法. 挂接命令(mount) 首先,介绍一下挂接(mount)命令的使用方法,mount命令参数非常多,这里主要讲一下今天我们要用 ...

  6. android 补间动画和Animation

    介绍: 补间动画是一种设定动画开始状态.结束状态,其中间的变化由系统计算补充.这也是他叫做补间动画的原因. 补间动画由Animation类来实现具体效果,包括平移(TranslateAnimation ...

  7. [课程设计]Scrum 3.8 多鱼点餐系统开发进度(留言反馈系统设计)

    Scrum 3.8 多鱼点餐系统开发进度(留言反馈系统设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统 ...

  8. Java注解和代理实现

    1.定义注解 import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java. ...

  9. 用eclipse打开已经编译的工程

    第一种方法: eciplise------>File------>Import------>General------>Existing Project into Worksp ...

  10. linux两台服务器之间文件/文件夹拷贝

    跨服务器拷贝需要用到的命令是scp. ----------------------拷贝文件夹---------------------------------------------- 把当前文件夹t ...