django手动建第三张关系表的增删改查

import os
if __name__ == '__main__':
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day84.settings")
    import django
    django.setup()
    # 手动创建第三张表的第一种方式(比较麻烦)
    from app01 import models
    # 给xxx这本书新增lqz和egon两个作者(增)
    # models.Book2Author.objects.create(book_id=1,author_id=1)
    # models.Book2Author.objects.create(book_id=1,author_id=2)
    # 删 把两个作者都删除
    # ret=models.Book2Author.objects.filter(book_id=1).delete()
    # 查询xxx这本书所有的作者
    # book=models.Book.objects.get(pk=1)
    # # book.auhtors
    # ret=models.Book2Author.objects.filter(book_id=book.pk)
    # for i in ret:
    #     print(i.author.name)
    # 基于双下划线查询
    # ret = models.Book.objects.filter(name='红楼梦').values('authors__name')
    # print(ret)



    # 既能用orm的关联查询,又能手动创建第三张表

    # add,clear,remove,set:都用不了了
    # 增,删,改:用表模型操作
    # 用表模型
    # 查询xxx这本书所有的作者
    # book1 = models.Book1.objects.get(pk=1)
    # authors=book1.authors.all()
    # for author in authors:
    #     print(author.name)
    # 基于双下划线的查询
    # ret=models.Book1.objects.filter(name='红楼梦').values('authors__name')
    # print(ret)

    # ret=models.Book2Author1.objects.create(book_id=1,author_id=2)


    # 以后用:
    #     -如果第三张表中没有其它字段,直接让它自动创建
    #     -如果第三张表中有其它字段,手动创建第三张表,并且,用ManyToManyField做关联
    # -用了ManyToManyField做了关联的作用是什么?(跟自动创建第三张表的所有的查询是一样的)

    # add, clear, remove, set: 都用不了了
    # 给红楼梦这本书添加egon作者
    # book=models.Book1.objects.get(pk=1)
    # egon=models.Author1.objects.get(pk=2)
    # book.authors.add(egon)

    # defer和only(高级阶段,提高查询效率)
    # ret=models.Book1.objects.all().values('id','name')
    # ret=models.Book1.objects.all().only('name')
    # ret=models.Book1.objects.all()
    # # 比如有10条数据---11句sql
    # for book in ret:
    #     # print(book.id)
    #     print(book.name)
    #     # 也有(不能这么写)
    #     print(book.price)
    ret = models.Book1.objects.all().defer('id','name','publish_id')
    for book in ret:
        print(book.price)
        # print(book.publish)
        # print(book.name)

    # 总结
    # only和defer 返回结果是queryset对象内包裹表模型的对象
    # only,就是只查我指定的字段,一定会包含id   注意:没查的字段不要再用了
    # defer,指定不取哪个字段,一定会包含id     注意:没查的字段不要再用了

 

posted @ 2019-01-16 21:15  彼岸花纽约  阅读(329)  评论(0编辑  收藏  举报