zoukankan      html  css  js  c++  java
  • django图书管理系统-外键字段的增删改查

    1、创建app02, 并在settings.py里面设置

    2、在app02/models.py里面,创建模型

    from django.db import models
    
    # Create your models here.
    
    class Book(models.Model):
        name = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8, decimal_places=2)
        publish_date = models.DateTimeField( auto_now_add= True)
        #添加表关联关系
        publish = models.ForeignKey( to='Publish', on_delete=models.CASCADE )
        authors = models.ManyToManyField( to='Author')
    
    
    class Publish( models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=64)
        email = models.EmailField()  #内部实现也是charField,定义为EmailField是为了表单校验
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        #添加表关联关系
        authordetail = models.OneToOneField( to='AuthorDetail', on_delete= models.CASCADE)
    
    
    #切表,是因为不常用的数据单独放一张表, 对经常用的数据也单独放一张表,提高查询的效率
    class AuthorDetail(models.Model):
        addr = models.CharField(max_length=32)
        phone = models.IntegerField()

    2、执行makemigrations和migrate, 同步数据库; 然后在对应的表格中添加数据;

    给publish出版社表添加数据

     给作者详情表添加数据:

     给作者表添加数据

    4、创建项目下创建一个test.py文件,并把manage.py里第一句话复制过来; 然后,可以在test.py里面直接调用模型来操作;

     

    5、对Books表外键字段,执行添加数据

    import  os
    import  sys
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'untitled1.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表的增删改查
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        publish_obj = models.Publish.objects.filter( pk=3 ).first()
        models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )

     6、对Books表外键字段,执行修改操作

    import  os
    import  sys
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kindeditor_pro.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表数据的增加
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        # publish_obj = models.Publish.objects.filter( pk=3 ).first()
        # models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )
    
        #数据表数据的修改
        #修改数据,方法1
        # models.Book.objects.filter(name="三体").update(publish_id = 2)
        #修改数据,方法2
        publish_obj = models.Publish.objects.filter( pk = 3).first()
        models.Book.objects.filter(name="三体").update(publish = publish_obj)

    7、对Books表多对多字段的增加单条数据

    import  os
    import  sys
    from django.db import connection
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kindeditor_pro.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表,外键字段,数据的增加
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        # publish_obj = models.Publish.objects.filter( pk=3 ).first()
        # models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )
    
        #书籍表,外键字段,数据的修改
        #修改数据,方法1
        # models.Book.objects.filter(name="三体").update(publish_id = 2)
        #修改数据,方法2
        # publish_obj = models.Publish.objects.filter( pk = 3).first()
        # models.Book.objects.filter(name="三体").update(publish = publish_obj)
    
    
        #书籍表,多对多字段的增删改查
        book_obj = models.Book.objects.filter(name="三体").first()
        book_obj.authors.add(1)
        print(connection.queries)

    执行后,打印的源sql语句为:

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
     {'sql': 'SELECT VERSION()', 'time': '0.001'}, 
    {'sql': "SELECT `app02_book`.`id`, `app02_book`.`name`, `app02_book`.`price`, `app02_book`.`publish_date`, `app02_book`.`publish_id` FROM `app02_book` WHERE `app02_book`.`name` = '三体' ORDER BY `app02_book`.`id` ASC LIMIT 1", 'time': '0.000'}, 
    {'sql': 'SELECT `app02_book_authors`.`author_id` FROM `app02_book_authors` WHERE (`app02_book_authors`.`book_id` = 1 AND `app02_book_authors`.`author_id` IN (1))', 'time': '0.001'}, 
    {'sql': 'INSERT INTO `app02_book_authors` (`book_id`, `author_id`) VALUES (1, 1)', 'time': '0.001'}]

    比较重要的一句,样式美化后:

    SELECT
        `app02_book`.`id`,
        `app02_book`.`name`,
        `app02_book`.`price`,
        `app02_book`.`publish_date`,
        `app02_book`.`publish_id     
    FROM ` app02_book ` WHERE ` app02_book `.` NAME ` = '三体' 
    ORDER BY ` app02_book `.` id ` ASC LIMIT 1

     

    然后,要注意的地方,插入数据之前,要先检查是否有重复数据,django自动做了重复数据检查的查询操作,所以不会报错;

    如果是手动在数据库中插入重复数据会报错,例如,手动再次执行重复插入的操作:

    8、对Books表多对多字段的增加多条数据

    import  os
    import  sys
    from django.db import connection
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kindeditor_pro.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表,外键字段,数据的增加
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        # publish_obj = models.Publish.objects.filter( pk=3 ).first()
        # models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )
    
        #书籍表,外键字段,数据的修改
        #修改数据,方法1
        # models.Book.objects.filter(name="三体").update(publish_id = 2)
        #修改数据,方法2
        # publish_obj = models.Publish.objects.filter( pk = 3).first()
        # models.Book.objects.filter(name="三体").update(publish = publish_obj)
    
    
        #书籍表,多对多字段的增加单条数据
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据
        book_obj = models.Book.objects.filter(name="三体").first()
        book_obj.authors.add(1, 2)
        print(connection.queries)

     打印源sql:

    [{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.001'}, 
    {'sql': 'SELECT VERSION()', 'time': '0.000'}, 
    {'sql': "SELECT `app02_book`.`id`, `app02_book`.`name`, `app02_book`.`price`, `app02_book`.`publish_date`, `app02_book`.`publish_id` FROM `app02_book` WHERE `app02_book`.`name` = '三体' ORDER BY `app02_book`.`id` ASC LIMIT 1", 'time': '0.001'}, 
    {'sql': 'SELECT `app02_book_authors`.`author_id` FROM `app02_book_authors` WHERE (`app02_book_authors`.`book_id` = 1 AND `app02_book_authors`.`author_id` IN (1, 2))', 'time': '0.002'}, 
    {'sql': 'INSERT INTO `app02_book_authors` (`book_id`, `author_id`) VALUES (1, 2)', 'time': '0.001'}]

     9、Book表多对多字段,关联表添加多条数据,方法2

    import  os
    import  sys
    from django.db import connection
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kindeditor_pro.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表,外键字段,数据的增加
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        # publish_obj = models.Publish.objects.filter( pk=3 ).first()
        # models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )
    
        #书籍表,外键字段,数据的修改
        #修改数据,方法1
        # models.Book.objects.filter(name="三体").update(publish_id = 2)
        #修改数据,方法2
        # publish_obj = models.Publish.objects.filter( pk = 3).first()
        # models.Book.objects.filter(name="三体").update(publish = publish_obj)
    
    
        #书籍表,多对多字段的增加单条数据
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法1
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1, 2)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法2
        # author_obj1 = models.Author.objects.filter(id=1).first()
        # author_obj2 = models.Author.objects.filter(id=2).first()
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add( author_obj1, author_obj2 )
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法3
        author_queryset = models.Author.objects.all()
        book_obj = models.Book.objects.filter(name="三体").first()
        book_obj.authors.add( *author_queryset)
        print(connection.queries)

     10、book表多对多字段,关联表删除数据remove方法

    import  os
    import  sys
    from django.db import connection
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kindeditor_pro.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表,外键字段,数据的增加
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        # publish_obj = models.Publish.objects.filter( pk=3 ).first()
        # models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )
    
        #书籍表,外键字段,数据的修改
        #修改数据,方法1
        # models.Book.objects.filter(name="三体").update(publish_id = 2)
        #修改数据,方法2
        # publish_obj = models.Publish.objects.filter( pk = 3).first()
        # models.Book.objects.filter(name="三体").update(publish = publish_obj)
    
    
        #书籍表,多对多字段的增加单条数据
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法1
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1, 2)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法2
        # author_obj1 = models.Author.objects.filter(id=1).first()
        # author_obj2 = models.Author.objects.filter(id=2).first()
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add( author_obj1, author_obj2 )
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法3
        # author_queryset = models.Author.objects.all()
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add( *author_queryset)
        # print(connection.queries)
    
        #删除书籍对象与作者的绑定关系
        book_obj = models.Book.objects.filter(name="三体").first()
        book_obj.authors.remove(1,2)

     

    11、 book表多对多字段,关联表删除数据clear方法

     clear会删除所有绑定关系,不需要传入参数

    import  os
    import  sys
    from django.db import connection
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kindeditor_pro.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表,外键字段,数据的增加
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        # publish_obj = models.Publish.objects.filter( pk=3 ).first()
        # models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )
    
        #书籍表,外键字段,数据的修改
        #修改数据,方法1
        # models.Book.objects.filter(name="三体").update(publish_id = 2)
        #修改数据,方法2
        # publish_obj = models.Publish.objects.filter( pk = 3).first()
        # models.Book.objects.filter(name="三体").update(publish = publish_obj)
    
    
        #书籍表,多对多字段的增加单条数据
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法1
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1, 2)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法2
        # author_obj1 = models.Author.objects.filter(id=1).first()
        # author_obj2 = models.Author.objects.filter(id=2).first()
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add( author_obj1, author_obj2 )
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法3
        # author_queryset = models.Author.objects.all()
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add( *author_queryset)
        # print(connection.queries)
    
        #删除书籍对象与作者的绑定关系
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.remove(1,2)
    
        # 清空书籍对象与作者的所有绑定关系
        book_obj = models.Book.objects.filter(name="三体").first()
        book_obj.authors.clear()

     12、 book表多对多字段,关联表修改关联数据

    import  os
    import  sys
    from django.db import connection
    
    if __name__ == "__main__":
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kindeditor_pro.settings')
        import  django
        django.setup()
        from app02 import  models
    
        #书籍表,外键字段,数据的增加
        #添加数据,方法1
        # models.Book.objects.create( name = "白蛇",price= 66.66,  publish_id = 1 )
        #添加数据,方法2
        # publish_obj = models.Publish.objects.filter( pk=3 ).first()
        # models.Book.objects.create( name="三体", price = 68.89, publish = publish_obj )
    
        #书籍表,外键字段,数据的修改
        #修改数据,方法1
        # models.Book.objects.filter(name="三体").update(publish_id = 2)
        #修改数据,方法2
        # publish_obj = models.Publish.objects.filter( pk = 3).first()
        # models.Book.objects.filter(name="三体").update(publish = publish_obj)
    
    
        #书籍表,多对多字段的增加单条数据
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法1
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add(1, 2)
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法2
        # author_obj1 = models.Author.objects.filter(id=1).first()
        # author_obj2 = models.Author.objects.filter(id=2).first()
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add( author_obj1, author_obj2 )
        # print(connection.queries)
        # 书籍表,多对多字段的增加多条数据, 方法3
        # author_queryset = models.Author.objects.all()
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.add( *author_queryset)
        # print(connection.queries)
    
        #删除书籍对象与作者的绑定关系
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.remove(1,2)
    
        # 清空书籍对象与作者的所有绑定关系
        # book_obj = models.Book.objects.filter(name="三体").first()
        # book_obj.authors.clear()
    
        #修改书籍对象与作者的所有绑定关系
        book_obj = models.Book.objects.filter(name="三体").first()
        book_obj.authors.set([2,])  #参数必须是可迭代对象; 执行的时候是先清空后添加;

     

     执行后就只剩一条

  • 相关阅读:
    【转】高性能网络编程4--TCP连接的关闭
    Kubernetes 用了,延迟高了 10 倍,问题在哪?
    多路复用和多路分用
    网络七层模型与四层模型区别
    Go验证包出错 dial tcp 34.64.4.17:443: i/o timeout
    spring Bean配置的三种形式
    Spring容器IOC初始化过程
    Go 特殊语法
    服务发现的基本原理与比较:Eureka vs Consul vs Zookeeper
    docker 常用命令
  • 原文地址:https://www.cnblogs.com/harryTree/p/11899067.html
Copyright © 2011-2022 走看看