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)