Django 的 ORM 有多种关系:一对一,多对一,多对多。
各自定义的方式为 :
一对一: OneToOneField
多对一: ForeignKey
多对多: ManyToManyField
上边的描述太过数据而缺乏人性化,我们来更人性化一些:
多个属于一个,即 belong to : ForeignKey,多个属于一个
一个有一个,即 has one: OneToOneField
一个有很多个,即 has many: lots of A belong to B 与 B has many A,在建立 ForeignKey 时,另一个表会自动建立对应的关系
一个既有很多个,又属于很多个,即 has many and belong to : ManyToManyField,同样只能在一个model类中说明,关联表会自动建立。
操作数据表总的来说就是:
一对一和一对多
1、查找数据使用 __ 连接
2、获取数据时使用 . 连接
前提条件-正向和反向的定义:
正向:基于存在ForeignKey或ManyToManyField 字段的表查找为正向
反向:基于不存在ForeignKey或ManyToManyField表查找为反向
#反向查询
_set
注意:xx_set中的xx为小写的表名
例子如下:
#-*- coding:utf-8 -*- from __future__ import unicode_literals from django.db import models # Create your models here. from django.db import models 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() class MyUser(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=64) def __unicode__(self): return self.username class News(models.Model): title = models.CharField(max_length=32) content = models.CharField(max_length=32) def __unicode__(self): return self.title class Favor(models.Model): user_obj = models.ForeignKey(MyUser) new_obj = models.ForeignKey(News) def __unicode__(self): return "%s -> %s" %(self.user_obj.username, self.new_obj.title) # ########################### 多对多 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) #=========================== 方式二,自定义关联表 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): c1 = models.ForeignKey(Host1) c2 = models.ForeignKey(HostAdmin1)