1.定义数据模型
以出版社、作家、作家信息、书籍四个对象模型为例:
(1)一本书籍只能有一个出版社,此为一对多关系(ForeignKey),主表为出版社,子表为书籍;
(2)一本书可以有多个作者,一个作者可以出多本书,此为多对多关系(ManyToManyField)
(3)作家和作家信息之间是一对一关系,即Author对象和AuthorProfile对象是一一对应的。
from django.db import models
class Publisher(models.Model):
name = models.CharField(max_length=30)
address = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Author(models.Model):
name = models.CharField("姓名",max_length=30)
age = models.IntegerField("年龄")
def __unicode__(self):
return u'%s' % (self.name)
class AuthorProfile(models.Model):
# 以下定义一对一关系,即Author对象和AuthorProfile对象是一对一关系
user = models.OneToOneField(Author, unique=True)
phone = models.CharField("电话",max_length=20)
email = models.EmailField("邮箱")
def __unicode__(self):
return 'user{}'.format(self.user.name)
class Book(models.Model):
title = models.CharField(max_length=100)
# 以下定义多对多关系,Author对象和Book对象是多对多关系
authors = models.ManyToManyField(Author)
# 以下定义一对多关系,主表是Publisher,子表是Book,Pulisher对象和Book对象是一对多关系
publisher = models.ForeignKey(Publisher, related_name="b_set")
publication_date = models.DateField()
def __unicode__(self):
return self.title
注意事项:
(1)OneToOneField,ForeignKey,ManyToManyField都是在子表中声明的;
(2)可以声明related_name作为主表对象访问从表数据的一种方式(以下详述)。
2.ForeignKey数据访问方式
(1)查找[某出版社]出版的所有书籍【通过主表对象查询从表数据】
# 获取[某出版社]对象
publisher=Publisher.objects.all().filter("筛选某出版社的条件")
#通过[某出版社]主表对象获取所有书籍对象
books = publisher.book_set.all()
注意: django默认每个主表的对象都有一个对应外键的属性,可以通过它来查询属于主表的子表的信息。这个属性的名称默认是以子表的名称小写加上_set()来表示,默认返回的是一个querydict对象,你可以继续根据情况来查询等操作。
有时这么查询会比较麻烦,此时可以在定义主表的外键的时候设定好related_name,用related_name来查询。
# 获取[某出版社]对象
publisher=Publisher.objectsall().filter("筛选某出版社的条件")
#通过[某出版社]主表对象获取所有书籍对象
books = publisher.b_set.all()
(2)查找[某书籍]的出版社【通过从表对象查询主表数据】
假如先得到了一个子表的对象,那只要获取该对象关联主表的外键的属性,就可以得到主表的信息了。
# 获取[某书籍]对象
book=Book.objects.all().filter("筛选某书籍的条件")
#通过[书籍]从表对象获取出版社对象
publisher = book.publisher