models.py繼續(xù)上一篇
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.先添加出版社和作者數(shù)據(jù)
單表添加數(shù)據(jù)見上一篇文章
書籍表中書籍和出版社是一對多關系,一本書只有一個出版社,一個出版社有多本書
2.添加書籍
添加書籍前,先把出版社查找出來,然后創(chuàng)建對應關系
p = Publisher.objects.get(name="Apress")
Books.objects.create(title="python django",publisher=p)
這里將出版社和書籍創(chuàng)建了關聯(lián)
多對多 --- 增(manytomany)
書籍和作者間是多對多關系,一本書有多個作者,一個作者有多本書,創(chuàng)建書籍對應關系前,先查找作者,然后添加到書籍作者中
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")
注:在一對多和多對多中,正向查詢都是先查詢某一個值,然后根據(jù)該值得外鍵去查詢對應數(shù)據(jù),反向查詢先查詢需要查詢的數(shù)據(jù)然后使用表名+_set反向關聯(lián)