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)