http://blog.sina.com.cn/s/blog_62971b230100kgqp.html
关系
诚然,关系数据库的精华在于数据库表之间的关系。Django提供了定义三种常见数据库关系的方法:一对多(many-to-one)、多对多(many-to-many)、一对一(one-to-one)。
一对多关系(MANY-TO-ONE)
通过ForeignKey可以定义一对多关系。使用ForeignKey的方法和使用其它字段类型是一样的:将它作为模型类的一个属性。
ForeignKey需要一个位置参数:要关联的模型类。
例如,一个汽车模型Car有一个制造商字段Manufacturer,也就是说,一个制造商制造了多种汽车,但是一种汽车只能有一个制造商,可以使用如下的代码定义:
class Manufacturer(models.Model):
class Car(models.Model):
# ...
你也可以创建递归关系(recursive relationships,一个对象与其自身存在一对多关系)和与尚未定义的模型的关系;查看模型字段参考了解更多细节。
我们建议将外键(ForeignKey)字段的名字设为模型名的小写字母形式(例如上例中的manufacturer),但不是必须这样做。当然,你也可以任意为之命名。例如:
class Car(models.Model):
# ...
外键字段也接受一些其它的附加参数,这些参数的解释可以查看模型字段参考。这些可选参数用于定义数据库表的关系是如何起作用的;它们都是可选的。
多对多关系(MANY-TO-MANY RELATIONSHIPS)
通过ManyToManyField可以定义多对多关系。使用ManyToManyField的方法和使用其它字段类型是一样的:将它作为模型类的一个属性。
ManyToManyField需要一个位置参数:要关联的模型类。
例如,一个匹萨(Pizza)上可以有多个装饰品(Topping),也就是说,一个装饰品可以放在多个匹萨上,反之一个匹萨上可以有多个装饰品,具体表现形式如下:
class Topping(models.Model):
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping)
就像外键一样,你也可以建立递归关系(recursive relationshiops,一个对象与其自身的一对多关系)和与尚未建立的模型的关系;查看模型字段参考了解更多细节。
我们建议多对多字段的名字采用关联的模型对象的复数形式(例如上例中的toppings),但不是必须这样做。
在哪个模型中定义ManyToMany字段无所谓,要知道你仅需在其中一个模型中定义,而不是两边都定义。
总之,如果你使用Django的admin应用程序,ManyToMany实例对象将显现在要编辑的admin界面上。在上面的例子中,toppings在Pizza模型中(而不是Topping表有一个pizzas多对多字段),因为我们说匹萨上有多个装饰品要比说一个装饰品存在于多个匹萨上更符合常理。通过上面的设置,将允许用户在Pizza的admin表单中选择装饰品。
多对多字段也接受一些其它的附加参数,这些参数的解释可以查看模型字段参考。这些可选参数用于定义数据库表的关系是如何起作用的;它们都是可选的