zoukankan      html  css  js  c++  java
  • Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一、数据库连接配置

    • 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可

    • 如果连接mysql,需要在配置文件中的setting中进行配置:

      将DATABASES={} 更新为

    DATABASES = {
        'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'PORT': 3306,
        'USER': 'root',
        'PASSWORD': 'pie123',
        'NAME': 'test_database',
        }
    }

    同时还要在__init__.py文件中进行初始化设置:

    # 因为django默认链接mysql数据库,用的是MySQLdb模块,python3.0以后,不支持MySQLdb,需要用pymysql替换MySQLdb
    import pymysql
    pymysql.install_as_MySQLdb()

    配置完以后,要进行数据迁移(在pycharm的终端Terminal中运行指令),否则数据更新不能同步到mysql数据库中

    python manage.py makemigrations    ----记录数据库的变化,在migrations文件中可以看到记录
    python manage.py migrate           ----将变化同步到数据库中

    或者

    菜单 tools--->Run manage.py Task,即可进入manage.py,直接输入以下指令即可

    makemigrations    ----记录数据库的变化,在migrations文件中可以看到记录
    migrate           ----将变化同步到数据库中

    显示没有提交到数据库的数据

    python3 manage.py showmigrations  ---->查看那个没有提交到数据库

    二、orm创建表和字段

    1、orm的使用限制

    只能创建数据表和字段不能创建数据库(必须手动创建数据库)

    ​ 创建一个类就表示创建了一个数据表,类中的属性表示数据表中的字段

    创建表和字段在modules.py中

    类 --->  数据表
    属性 --->  字段

    2、orm创建表和字段

    在app的 models.py 中创建表

    # 类必须继承models.Model类,否则只表示一个普通的类
    # AutoField 自动增长的int类型
    # primary_key=True 该字段是主键
    # CharField(max_length=32) 表示 varchar(32)
    class User(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=32)
        password = models.CharField(max_length=32)
        address = models.CharField(max_length=32)

    三、单表增删改查

    1、增加数据

    (1)方式一

    # 直接创建数据,返回值是一个对象
    book = models.Book.objects.create(name='西游记',price=50.5)
    print(book.name)

    (2)方式二

    book = models.Book.objects.filter(name='西游记').first()
    book.delete()

    3、修改数据

    (1)方式一

    models.Book.objects.filter(name='西游记').update(name='红楼梦')

    (2)方式二

    对象没有update方法,可以利用对象获取它的属性,来修改数据,改完后要保存

    book = models.Book.objects.filter(name='西游记').first()
    book.name = '红楼梦'
    book.save()

    4、查询数据

    # 调用queryset对象的query可以查看对应的sql语句
    res = models.Book.objects.all()
    print(res.query)

    (1)查询数据API

    # 1. all():                  查询所有结果
      res = models.Book.objects.all()
    
    # 2. filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,用逗号分隔,他们之间是and的关系
      res = models.Book.objects.filter(name='西游记',price='14')
    
    # 3. get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
      res = models.Book.objects.filter(id=1)
        
    # 4. exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象,用逗号分隔,他们之间是and的关系
     res = models.Book.objects.exclude(name='西游记',price='23.8')
        
    # 5. order_by(*field):       对查询结果排序('-id'),字段名钱前加 “-” 表示从大到小排序
      res = models.Book.objects.all().order_by('price')
      res = models.Book.objects.all().order_by('-price')  
    
    # 6. reverse():              对查询结果反向排序,一定要先排序才能反向排序
      res = models.Book.objects.all().order_by('-price').reverse()
        
    # 7. count():                返回数据库中匹配查询(QuerySet)的对象数量。
      res = models.Book.objects.all().filter(name='西游记').count()
        
    # 8. first():                返回第一条记录
      res = models.Book.objects.all().first()
        
    # 9. last():                返回最后一条记录
      res = models.Book.objects.all().last()
        
    # 10. exists():              如果QuerySet包含数据,就返回True,否则返回False
     res = models.Book.objects.filter(name='三国演义').exists()
        
    # 11. values(*field):        返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列,model的实例化对象,而是一个可迭代的字典序列
     res = models.Book.objects.all().values('name','price') 
        # 返回值为QuerySet对象<{name='红楼梦',price=18},{name='西游记',price=58}>
        
    # 12. values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
      res = models.Book.objects.all().values_lists('name','price') 
        # 返回值为QuerySet对象<(name='红楼梦',price=18),(name='西游记',price=58)>
        
    # 13. distinct():            从返回结果中剔除重复纪录,只要带了id,去重就没有意义了
      res = models.Book.objects.all().values('name').distinct()

    (2)基于上下划线的模糊查询

    # 1. __in 字段的值在其中
    Book.objects.filter(price__in=[100,200,300])
    
    # 2. __gt 字段的值大于指定值
    Book.objects.filter(price__gt=100)
    
    # 3. __lt 字段的值小于指定值
    Book.objects.filter(price__lt=100)
    
    # 4. __gte 字段的值大于等于指定值
    Book.objects.filter(price__gte=100)
    
    # 5. __lte 字段的值小于等于指定值
    Book.objects.filter(price__lte=100)
    
    # 6. __range 字段的值在指定区间内,包含头和尾
    Book.objects.filter(price__range=[100,200])
    
    # 7. __contains 字段的值包含指定值,区分大小写
    Book.objects.filter(title__contains="python")
    
    # 8. __icontains 字段的值包含指定值,不区分大小写
    Book.objects.filter(title__icontains="python")
    
    # 9. __startswith 字段的值以指定值开头
    Book.objects.filter(title__startswith="py")
    
    # 10. __endswith 字段的值以指定值开头
    Book.objects.filter(title__startswith="on")
    
    # 11. __year 日期格式的年为指定值
    Book.objects.filter(pub_date__year=2012)

    四、在Python脚本中调用Django环境

    import os
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled15.settings")
        import django
        # 启动Django环境
        django.setup()
    
        from app01 import models
    
        books = models.Book.objects.all()
        print(books)
  • 相关阅读:
    Java学习开篇
    《我的姐姐》
    世上本无事,庸人自扰之
    这48小时
    补觉
    淡定
    es java api 设置index mapping 报错 mapping source must be pairs of fieldnames and properties definition.
    java mongodb groupby分组查询
    linux 常用命令
    mongodb too many users are authenticated
  • 原文地址:https://www.cnblogs.com/zhangbingsheng/p/10632475.html
Copyright © 2011-2022 走看看