应用场景:python
#!/usr/bin/env python# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.db import modelsclass Author(models.Model):name = models.CharField(max_length=30)class Publisher(models.Model):name = models.CharField(max_length=50)class Book(models.Model):name = models.CharField(max_length=50)#一本书由一家出版社发布,一个出版社发布多本书。属于一对多关系,用ForeignKey()pub = models.ForeignKey(Publisher)#一本书能够由多个做者合写,一个做者能够写多本书,属于多对多关系,用ManyToManyFieldauthors = models.ManyToMany(Author)
生成结果:
一共生成了4张表:
web_author(做者表)
web_publisher(出版社表)
web_book_authors(记录book与author多对多关系表。多对多关系要借助第三张表创建关系)
web_book(book表,其中pub_id体现书与出版社之间的一对多关系)
3. 表关系进阶web
1. 关联还没有定义的Model
class Book(models.Model):name = models.CharField(max_length = 50)#若是Publisher与Author在Book后面定义,须要使用model 的名称,而不是使用 model 对象自己pub = models.ForeignKey('Publisher')authors = models.ManyToManyField('Author')class Publisher(models.Model):name = models. CharField (max_length = 50)class Author(models.Model):name = models.CharField(max_length = 30)
2. Model关联自身
1) Model能够与自身作多对一关系
class People(models.Model):name = models.CharField(max_length = 30)leader = models.ForeignKey('self', blank=True, null=True)
说明:一个领导有多个下属,一个下属对应一个直接领导,同时领导也是领导的下属。就属于多对一关系,且须要与自身作多对一关系。且注 意,设计这表时要设置blank=True和null=True.2) Model能够与自身作多对多关系
class Person(models.Model):friends = models.ManyToManyField('self')
用来定义一对一关系。笼统地讲,它与声明了 unique=True 的 ForeignKey 很是类似,不一样的是使用反向关联的时候,获得的不是一个对象列表,而是一个单独的对象。在某个 model 扩展自另外一个 model 时,这个字段是很是有用的;例如: 多表继承 (Multi-tableinheritance) 就是经过在子 model 中添加一个指向父 model 的一对一关联而实现的。必须给该字段一个参数:被关联的 model 类。工做方式和 ForeignKey 同样,连递归关联 (recursive) 和 延后关联 (lazy) 都同样。 此外,OneToOneField 接受 ForeignKey 可接受的参数,只有一个参数是 OnetoOneField 专有的:OneToOneField.parent_link, 若是为 True,而且做用于继承自某个父 model 的子 model 上(这里不能是延后继承,父 model 必须真实存在 ),那么该字段就会变成指向父类实例的引用(或者叫连接), 而不是象其余OneToOneField 那样用于扩展父类并继承父类属性。
from django.db import models, transaction, IntegrityErrorclass Place(models.Model):name = models.CharField(max_length=50)address = models.CharField(max_length=80)def __unicode__(self):return u"%s the place" % self.nameclass Restaurant(models.Model):place = models.OneToOneField(Place, primary_key=True)serves_hot_dogs = models.BooleanField()serves_pizza = models.BooleanField()def __unicode__(self):return u"%s the restaurant" % self.place.nameclass Waiter(models.Model):restaurant = models.ForeignKey(Restaurant)name = models.CharField(max_length=50)def __unicode__(self):return u"%s the waiter at %s" % (self.name, self.restaurant)
>>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')>>> p1.save()>>> r = Restaurant(place=p1, serves_hot_dogs=True, serves_pizza=False)>>> r.save()>>> p1.restaurant<Restaurant: Demon Dogs the restaurant>>>> Place.objects.get(restaurant__place__name__startswith="Demon")<Place: Demon Dogs the place>>>> Waiter.objects.filter(restaurant__place__name__startswith="Demon")