七.手动创建第三张表
1.自动创建(常用)
- 优点 : 第三张表以及对应的外键关联字段不需要书写
- 缺点 : 可扩展性差, 无法对ORM自动生成的中间表进行增加字段的操作
- 注意 : 可以使用ORM提供给多对多关系表操作API以及正方向和双下划线查询
- 第三张表中没有其他字段
class Author(models.Model):
name = models.CharField(max_length=32,verbose_name='作者名')
# 通过ORM自带的ManyToManyField自动创建第三张表
class Book(models.Model):
title = models.CharField(max_length=32,verbose_name='书名')
authors = models.ManyToManyField(to='Author',related_name='authors')
2.全手动创建(基本不用)
- 优点 : 可扩展性强, 第三张表的内容完全取决于自己
- 缺点 : ORM提供给多对多关系表之间的API以及正反向和双下划线查询都不支持, 并且代码也会多一些
class Author(models.Model):
name = CharField(max_legth=32,verbose_name='作者名')
class Book(models.Model):
title = CharField(max_length=32,verbose_name='书名')
class BookAuthor(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
3.半手动创建(比较常用)
- 优点 : 既可以对第三张表进行字段的添加, 也能使用ORM提供的正反向和双下划线查询
- 缺点 : 无法使用ORM提供的多对多表关系之间的API (add, set, remove, clear)
class Author(models.Model):
name = models.CharField(max_length=32,verbose_name='作者名')
class Book(models.Model):
title = models.CharField(max_length=32,verbose_name='书名')
authors = models.ManyToManyField(
to='Author', # 建立多对多关系的表,to_field参数可以不指定默认是主键
through='BookAuthor', # 第三张表名
through_fields=('book','author'))
# 第三张表中对应需要关联两张表的字段,以元组形式传
# 顺序:外键字段在哪张表,该表就排在前面
class BookAuthor(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
八.单表操作之增、删、改、查
QuerySet对象它是一个生成器, 也可以将其看成一个列表
1.增
# 方式一 : create()方法
models.Author.objects.create(name='Rub',age=23,email='[email protected]')
# 方式二 : 创建对象再save()保存
author_obj = models.Author(name='Rub',age=23,email='[email protected]')
author_obj.save()
2.删
# 方式一 : delete()方法
rows = models.Author.objects.all().delete()
print(rows) # rows为影响的条数
rows = models.Author.objects.filter(pk=2).delete() # 主键为2的删除
# 方式二 : 获取对象再进行删除delete()
author_obj = models.Author.objects.filter(name="Rub")
author_obj.delete()
3.改
# 方式一 : update()
models.Author.objects.filter(name='Rub').update(age=99)
# 方式二 : get()获取对象再进行赋值再save()保存
author_obj = models.author.objects.get(name='Rub')
author_obj.name = 'SmallRub'
author_obj.save()
4.查
- QuerySet对象的查询方法👇
九.QuerySet对象的查询方法
ORM提供了13条查询API
1.all( ) : 查询所有结果
- QuerySet用
.all( )
取值的时候,不会一下子全部取出来, 而是每次只取21条 (LIMIT21)
res = models.User.objects.all(