Django 的 ORM

Django 的 ORM 有多种关系:一对一,多对一,多对多。

        各自定义的方式为 :

一对一: OneToOneField

多对一: ForeignKey

多对多: ManyToManyField

 

举一个一对多的ForeignKey的例子,一个有很多个,即 has many:  lots of A belong to B 与 B has many A,在建立 ForeignKey 时,另一个表会自动建立对应的关系

一个服务器机柜里面可以放置多台服务器,一台服务器只能放置在一个机柜里面,如下所示:

class Server_Cabinet(models.Model):

name = models.CharField(‘机柜名称‘, max_length=10)

position = models.CharField(‘机柜位置‘, max_length=10)
        height = models.IntegerField(‘机柜高度‘)

def __unicode__(self):

return self.name
    class Server(models.Model):
        name = models.ForeignKey(Server_Cabinet, related_name=‘Cabinet‘)
        disk = models.IntegerField(‘硬盘大小‘, max_length=10)
        memory = models.IntegerField‘内存大小‘)

def __unicode__(self):

return self.name

上面定义的只是一些常用字段,下面要是查找一个服务器机柜中有哪些服务器信息,怎么做呢?

先查询到机柜的位置:

pos = Server_Cabinet.objects.fiter(你的条件)

返回一个机柜对象,然后查询pos关联的所有的服务器对象:

server = pos.Cabinet.all()

默认返回的是一个querydict对象,你可以继续的根据情况来查询等操作。

再举一个多对多的例子, 一个既有很多个,又属于很多个,即 has many and belong to : ManyToManyField,同样只能在一个model类中说明,关联表会自动建立。

一台主机可以拥有多个管理员,一个管理员可以管理多台主机:

class Manager(models.Model):

name = models.CharField(‘姓名‘,max_length=30)

age = models.IntegerField(‘年龄‘)

sex = models.CharField(‘性别‘,max_length=2)

def __unicode__(self):

return self.name

class Server(models.Model):

manager = models.ManyToManyField(Manager, related_name=‘User‘)

disk = models.IntegerField(‘硬盘大小‘, max_length=10)

memory = models.IntegerField‘内存大小‘)

def __unicode__(self):

return self.name

反向查询,查询一位管理员管理主机信息:

info = Manager.objects.get(你的条件)

info.User_set.all()

正向查询,一台主机对应的所有管理员:

user = Server.objects.get(条件)

user.manager.all()

添加多对多关系,添加管理者:

user = Manager.objects.get(你的条件)

server = Server.objects.get(条件)

server.manager.add(user)

删除多对多关系,删除管理员:

user = Manager.objects.get(你的条件)

server = Server.objects.get(条件)

server.manager.remove(user)

时间: 2024-09-28 18:41:03

Django 的 ORM的相关文章

Django models ORM基础操作--白话聊Django系列

上次我们讲完了views视图,那我们这次来看一下Django强大的ORM,可以这么说,你不懂Django的ORM,你就不懂Django,那废话不多说 ORM又称关系对象映射,在ORM里,一张表就是一个类,一行数据就是类的一个对象 在Django中遵循code first的原则,即:根据代码中定义的类来自动生成数据库表 利用ORM来实现定义表,以及对表进行操作 注意:在连接数据库上,Django默认是连接MySQLdb的,但是在python3中,不是很完美的支持这个模块,所以创建的Django项目

Django:之ORM、CMS和二维码生成

Django ORM Django 的数据库接口非常好用,我们甚至不需要知道SQL语句如何书写,就可以轻松地查询,创建一些内容,所以有时候想,在其它的地方使用Django的 ORM呢?它有这么丰富的 QuerySet API. settings.py import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) SECRET_KEY = 'at8j8i9%[email protected]#64^0&qlr6m5yc(_&m

[Django]Django的orm中get和filter的不同

Django的orm中get和filter的不同 Django的orm框架对于业务复杂度不是很高的应用来说还是不错的,写起来很方面,用起来也简单.对于新手来说查询操作中最长用的两个方法get和filter有时候一不注意就会犯下一些小错误.那么今天就来小节下这两个方法使用上的不同. 我常用的是1.5版本的django,就以此为例来说说吧. 文档 首先对比下两个函数文档上的解释. get Returns the object matching the given lookup parameters,

人生苦短,我用python-- Day19 django框架之URL路由系统、视图应用、模板应用、django之orm应用

目录 一.django的URL应用 二.django的视图应用 三.django的模板应用 四.django的orm应用 补充: 补充一:getlis 应用场景:当前端发送的数据为多个的时候,后台如果还用get获取数据,那么就会出问题,所以这里有一个getlist方法进行数据的获取. 试验案例:当前端有一个多选的checkbox的时候,那么就要使用getlist进行获取数据了 urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^get

django的orm获取字段去重值

如果要用django的ORM获取一个表字段所有可能的去重值. 网上找了很多,都是用distinct关键字,但如何没有随后的order_by, 还是达不到要求的. 最后搞定. 参考URL http://tishion.sourceforge.net/%E5%85%B3%E4%BA%8Edjango%E4%B8%AD%E7%9A%84%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9Capi%E4%B9%8Bdistinct%E5%8E%BB%E9%87%8D%

Django 数据库ORM 操作 - 字段的类型和参数

通过Django的ORM创建表的时候,我们需要定义自己的类. 定义类的时候,他有各种各样的字段类型,每个字段都有自己的参数可以进行配置,下面简单的归纳一下. 首先看看字段的类型.尽管Python提供了近乎20种类型,他转换成数据库表之后,其实本质就是4个类型:字符串,数字,时间和二进制. AutoField(Field)     - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField)     - bigint自增列,必须填入参数 prim

Django之ORM操作(***)

Django之ORM操作(***) 生成数据库: python manage.py makemigrations python manage.py migrate 常用命令: python manage.py runserver 0.0.0.0 python manage.py startapp appname python manage.py syncdb 创建superuser:python manage.py createsuperuser 在项目名中的__init__ .py 加: im

Django中ORM介绍和字段及其参数

ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库层之间充当了桥梁的作用. ORM的由来 字母‘O’起源于“对象”(Object),'R'代表“关系”(Relational). 几乎所有的软件开发过程中都会涉及到对象和关系数据库.在用户层面和业务逻辑层

Django之ORM性能优化建议

前言 DjangoORM数据层提供各种途径优化数据的访问. 如果事先理解Django的优化技巧,开发过程中稍稍留意,后期会省不少的工作量. 正题 一,利用标准数据库优化技术 传统数据库优化技术博大精深,不同的数据库有不同的优化技巧,但重心还是有规则的.在这里算是题外话,挑两点通用的说说: 索引,给关键的字段添加索引,性能能更上一层楼,如给表的关联字段,搜索频率高的字段加上索引等.Django建立实体的时候,支持给字段添加索引,具体参考Django.db.models.Field.db_index