Python学习---django多对多之Djanog默认表学习

案例一:

from django.db import models
class Book(models.Model):
    name = models.CharField(max_length=33)
    # 创建数据,当然不在此处设置,制只做示例演示
    # models.Book.objects.create(name='书名')

class Author(models.Model):
    name = models.CharField(max_length=33)
    # Django此时帮我们生成第三张表
    # 因为没有单独的第三张表的类,所以需要我们间接的操作
    # 通过Book,Author都可以进行操作
    m = models.ManyToManyField("Book")  # 形同虚设,跟Book,Author表都没关系
    # 创建数据,当然不在此处设置,制只做示例演示
    # models.Author.objects.create(name='人名')

    # 正向查找数据[先找到人后根据obj.m查找书名]
    # 查询一: 消耗内存
    author_obj = models.Author.objects.get(id=1)
    author_list = author_obj.m.all()  # 获取这个人所写的全部书
    for author in author_list:        # 需要多次查找数据库,很消耗内存
        print(author.name, author.m.all())
    # 查询二: 联表一次查询所有的数据
    author_obj = models.Author.objects.values("id", "m", "name")  # 里面有m这个外键属性
    author_obj2 = models.Author.objects.values("id", "m", "m__name" "name")  # m可以联表取值
    for item in author_list:
        # 查询到全部跟作者有关的书的ID[第三张表关联的就是ID]
        print(item['id'], item['name'], '书籍ID:', item['m'])
    # 反向查找数据
    book_obj = models.Book.objects.get(id=1)  # 先查找到书
    book_obj.author_set.all()   # 间接关联第三张表,查找书的作者

    # 数据的添加
    # 正向增加
    obj = models.Author.objects.get(id=1)
    obj.m.add("可以添加Book的对象")  # 不推荐,因为多了一次的查询次数
    obj.m.add(5)  # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=5这个Book对象]
    obj.m.add(5, 6)  # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=5/6这个Book对象]
    obj.m.add(*[4, 5])  # 第三张表中添加数据[对应关系,表示obj对象关联了M表中id=4/5这个Book对象]

    # 数据的删除
    obj = models.Author.objects.get(id=1)
    obj.m.remove(5)
    obj.m.remove(5, 6)
    obj.m.remove(*[5, 6])

    # 数据的清空
    obj = models.Author.objects.get(id=1)
    obj.m.clear()    # 清空obj对象关联的所有数据

    # 数据的更新
    obj = models.Author.objects.get(id=1)
    # 必须是迭代对象
    obj.m.set([1, ])     # 此时将book_id设置为1, author_id设置为1[因为获取的Author的ID是1]
    # set里面的值数据库内有则保留,没有则删除
    obj.m.set([1, 4, 5])  # 此时将book_id设置为4,5 author_id设置为1[会删除原来的1]

    # 反向操作【其余同上】
    obj = models.Book.objects.get(id=1)
    obj.author_set.add(1)
    obj.author_set.add(1, 2, 3, 4)
    ...
posted @ 2018-08-01 20:42  小a玖拾柒  阅读(350)  评论(0编辑  收藏  举报