您的位置:首页 > 编程语言 > Go语言

Django 的 ORM

2016-04-22 18:03 435 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ORM Django