models.py:
from django.db import models # 出版社 class Publisher(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=64, null=False, unique=True) def __str__(self): return "<Publisher object: {}>".format(self.name) # 书籍 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=64, null=False, unique=True) publisher = models.ForeignKey(to="Publisher") def __str__(self): return "<Book object: {}>".format(self.title) # 作者 class Author(models.Model): id = models.AutoField(primary_key=True) = models.CharField name (= 16 max_length, null = False, UNIQUE = True) Book = models.ManyToManyField (to = "Book") #-many association Book table, ORM will automatically generate the first three tables def __str __ (self ): return "<Object the Author: {}>." the format (the self.name)
book table:
author table:
author and associated third table book, author_book table:
publisher table:
Many to many query:
orm.py:
os Import IF __name__ == '__main__': # load Django project configuration information os.environ.setdefault ( "DJANGO_SETTINGS_MODULE", "mysite2.settings") # import Django, Django project and start the Import Django django.setup () from app01 Models Import author_obj = models.Author.objects.get (id = 2) to obtain the id of # 2 ret = author_obj.book.all () # id query all the books written by the author of 2 print (ret)
operation result:
create():
Create a new object, saving the object, and add it to the associated object set in, returns the newly created object.
orm.py:
import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models author_obj = models.Author.objects.get(id=1) # 获取 id 为 1 的作者 author_obj.book.create(title="《PHP》", publisher_id=2) # 通过该作者创建一本书
运行结果:
add():
把指定的 model 对象添加到关联对象集中
orm.py:
import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models # 把 id 为 2 的书添加给 id 为 4 的作者 author_obj = models.Author.objects.get(id=4) book_obj = models.Book.objects.get(id=2) author_obj.book.add(book_obj) # 也可以直接使用 id 添加 # author_obj.book.add(2)
运行结果:
添加多个
orm.py:
import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models # 添加多个,把 id 大于 4 的书添加给 id 为 3 的作者 author_obj = models.Author.objects.get(id=3) book_objs = models.Book.objects.filter(id__gt=4) author_obj.book.add(*book_objs) # 要用 * 把列表打散再传进去
运行结果:
remove():
从关联对象集中移除执行的 model 对象。
orm.py:
import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models author_obj = models.Author.objects.get(id=3) book_obj = models.Book.objects.get(title="《PHP》") author_obj.book.remove(book_obj) # 删除与 title 字段为 《PHP》 的关联 author_obj.book.remove(5) # 直接删除
运行结果:
原先 id 为 3 的作者关联的两本书籍本删除了
clear():
从关联对象集中清空一切对象。
orm.py:
import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models # 把 id 为 4 的作者的书籍全清空 author_obj = models.Author.objects.get(id=4) author_obj.book.clear()
运行结果:
author_id=4 的内容全被清空了
set():
更新 model 对象的关联对象。
orm.py:
import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models # 给 id 为 4 的作者添加 id 为 2、3 的两本书 author_obj = models.Author.objects.get(id=4) author_obj.book.set([2, 3])
运行结果:
外键补充:
外键中的 clear() 和 remove() 方法只能在 null=True 时用
models.py 中的 Book 类:
# 书籍 class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=64, null=False, unique=True) publisher = models.ForeignKey(to="Publisher", null=True) # 把 null 设置为 True def __str__(self): return "<Book object: {}>".format(self.title)
orm.py:
import os if __name__ == '__main__': # 加载 Django 项目的配置信息 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings") # 导入 Django,并启动 Django 项目 import django django.setup() from app01 import models # 清空 id 为 2 的出版社中的书籍 publisher_obj = models.Publisher.objects.get(id=2) publisher_obj.book_set.clear()
运行结果:
publisher_id 为 2 全变为 0