models -- 多表
- 示例表:
from django.db import models class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称") address = models.CharField("地址", max_length=50) city = models.CharField('城市', max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Meta: verbose_name = '出版商' verbose_name_plural = verbose_name def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=30) def __str__(self): return self.name class AuthorDetail(models.Model): sex = models.BooleanField(max_length=1, choices=((0, '男'), (1, '女'),)) email = models.EmailField() address = models.CharField(max_length=50) birthday = models.DateField() author = models.OneToOneField(Author) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2, default=10) def __str__(self): return self.title
表之间的关系
- Author和AuthorDetail 一对一,一个作者对应一个作者详情
- Book和Author 多对多,一本书能有多个作者,一个作者能写多本书
- Publisher和Book 一对多,一个出版社出版多本书,一本书只能在一个出版社出版
增删改查
-
- 增加Book表数据 -- 重点是对ForeignKey字段的处理
-
#方法一 #publisher_id是django自动生成的字段名 Book.objects.create( title='php', publisher_id=2, #这里的2是指为该book对象绑定了Publisher表中id=2的行对象,publisher_id是django自动在数据库中生成的字段名 publication_date='2017-7-7', price=99 )
-
#方法二 #首先创建Publisher对象,然后绑定publisher=pub_obj pub_obj = Publisher(name='河大出版社', address='保定', city='保定', state_province='河北', country='China', website='http://www.hbu.com') pub_obj.save() Book.objects.create( title='php', publisher=pub_obj, publication_date='2017-7-7', price=99 )
-
#方法三 #首先获取Publisher对象,然后绑定publisher=pub_obj pub_obj = Publisher.objects.get(id=1) Book.objects.create( title='php', publisher=pub_obj, publication_date='2017-7-7', price=99 )
-
-
增加Book表数据 -- 对ManyToMany字段的处理
-
如果第三张表是通过authors = models.ManyToManyField(Author)自动创建
-
#方法一,正向添加的写法book.authors.add(*field) author1 = Author.objects.get(id=4) author2 = Author.objects.filter(name='Wang')[0] book = Book.objects.get(id=1) #添加两条数据到第三张表中 book.authors.add(author1, author2) #等同于 #book.authors.add(*[author1, author2])
-
#方法二,反向添加的写法author.book_set.add(*field) author = Author.objects.get(id=8) books = Book.objects.filter(id__gt=1) author.book_set.add(*books)
-
-
- 增加Book表数据 -- 重点是对ForeignKey字段的处理
-
-
-
如果第三张表是自己手动创建,则可以使用增加ForeignKey数据的方法为第三张表添加数据
-
class Author(models.Model): name = models.CharField(max_length=30) def __str__(self): return self.name class Book(models.Model): title = models.CharField(max_length=100) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2, default=10) def __str__(self): return self.title class Book2Author(models.Model): book = models.ForeignKey("Book") author = models.ForeignKey("Author") class Meta: unique_together = ("book", "author")
-
-
-
-
- 删除Book表数据 -- 级联删除
-
Book.objects.filter(id=3).delete()
-
- 删除Book表数据 -- 级联删除
-
- 删除第三张表的数据 -- 通过ManyToMany字段删除
- 第三张表是通过authors = models.ManyToManyField(Author)自动创建的
-
#方法一,正向删除 get_authors = Author.objects.all() book = Book.objects.get(id=2) book.authors.remove(*get_authors)
-
#方法二,反向删除 author = Author.objects.get(id=6) books = Book.objects.all() author.book_set.remove(*books)
-
修改表数据
-
#方法一 Author.objects.filter(id=3).update(name='xiaodong') #方法二 obj = Author.objects.get(id=3) obj.name = 'xiaoze' obj.save()
-
- 删除第三张表的数据 -- 通过ManyToMany字段删除
-
- 查询表数据 -- 通过对象查询
- 正向查找 -- 查找编号为2的书的出版社所在城市
-
book = Book.objects.filter(id=2)[0] book.publisher.city #book.publisher是一个对象
-
- 正向查找 -- 查找编号为2的书的出版社所在城市
- 查询表数据 -- 通过对象查询
-
-
- 反向查找 -- 查找河大出版社出版的所有书
-
publish = Publisher.objects.filter(name='河大出版社')[0] publish.book_set.all().values('title')
-
- 反向查找 -- 查找河大出版社出版的所有书
- 查询表数据 -- 通过双下划线查询
- 正向查询
- 一对多关系
- 查找出版了php书的出版社其所在的城市
-
Book.objects.filter(title='php').values("publisher__city")
返回:[{'publisher__city': '保定'}]
- 多对多关系
- 查找php书的作者名字
-
Book.objects.filter(title='php').values("authors__name")
返回:[{'authors__name': 'xiaoze'}]
- 一对多关系
- 正向查询
-
-
-
-
-
-
-
查找作者是xiaoze的书
-
Book.objects.filter(authors__name='xiaoze').values('title')
返回:[{'title': 'php'}]
-
-
- publisher__city和authors__name中的publisher和authors是Book表中绑定的字段名
-
-
-
-
-
-
-
- 反向查询
- 一对多关系
- 查找在保定的出版社其出版的书
-
Publisher.objects.filter(city='保定').values("book__title")
返回:[{'book__title': 'python'}]
- 多对多关系
- 查找php书的作者名字
-
Author.objects.filter(book__title='php').values('name')
返回:[{'name': 'xiaoze'}]
- 一对多关系
- 反向查询
-
-
-
-
-
-
-
- 查找作者是xiaoze写的书
-
Author.objects.filter(name='xiaoze').values("book__title")
返回:[{'book__title': 'php'}]
- book__title中的book是表名Book的小写
-
-
-
-