models.py继续上一篇
from django.db import models
#出版社信息表
class Publisher(models.Model):
name = models.CharField(max_length=20)
address = models.CharField(max_length=50)
city = models.CharField(max_length=60)
def __unicode__(self):
return self.name
#作者表
class Auther(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField()
def __unicode__(self):
return"%s %s"%(self.first_name,self.last_name)
#书籍表
class Books(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Auther)
publisher = models.ForeignKey(Publisher)
def __unicode__(self):
return self.title
一对多 --- 增(ForeignKey)
1.先添加出版社和作者数据
单表添加数据见上一篇文章
书籍表中书籍和出版社是一对多关系,一本书只有一个出版社,一个出版社有多本书
2.添加书籍
添加书籍前,先把出版社查找出来,然后创建对应关系
p = Publisher.objects.get(name="Apress")
Books.objects.create(title="python django",publisher=p)
这里将出版社和书籍创建了关联
多对多 --- 增(manytomany)
书籍和作者间是多对多关系,一本书有多个作者,一个作者有多本书,创建书籍对应关系前,先查找作者,然后添加到书籍作者中
u1 = Auther.objects.get(name="jack")
u2 = Auther.objects.get(name="jones")
b = Books.objects.get(title="python django")
b.authors.add(u1)
b.authors.add(u2)
这里为书籍添加了2个作者
一对多 --- 查
获取某书籍的出版社:
Books.objects.get(title="python django").publisher
获取某出版社的书籍(反查):
Publisher.objects.get(name="Apress").books_set.all()
#或
Books.objects.get(publisher__name="Apress")
多对多 --- 查
获取某书籍的所有作者
Books.objects.get(title="python django").authors.all()
获取书籍的作者名为jack的作者
Books.objects.get(title="python django").authors.filter(name="jack)
查询一个作者的所有书籍(反查)
Auther.objects.get(name="jack").books_set.all()
#或
Books.objects.get(auther__name="jack")
注:在一对多和多对多中,正向查询都是先查询某一个值,然后根据该值得外键去查询对应数据,反向查询先查询需要查询的数据然后使用表名+_set反向关联