zoukankan      html  css  js  c++  java
  • DjangoORM操作

    Django ORM

    连接数据库

    使用PyCharm连接数据库

    如果不在django中指定要使用的数据库,那么django中默认连接sqlite的数据库 该数据库功能不是很强大,尤其是对日期类型格式的数据,不是很兼容

    django连接MySQL的两步配置

    1. 在settings文件中配置

      DATABASES = {
      	'default':{
      		'ENGINE':'django.db.backemds.mysql',	指定使用MySQL数据库
      		'NAME':'xxx',	指定MySQL中的指定库
      		'USER':'root',  用户名
      		'PASSWORD':'xxxxxx'	连接数据库的密码
      		'HOST':'127.0.0.1'	默认地址
      		'PORT':3306,	端口号
      		'CHARSET':'utf8'	使用的编码格式
      	}
      }
      
      1. 由于django默认使用的是mysqldb模块来连接数据库 但是改模块不兼容 不推荐使用告诉django使用pymysql模块连接数据库

        ###在项目名的文件夹找到__init__文件或者在自己定义的应用名文件夹下的__init__都可以指定
        import pymysql
        pymysql.install_as_MySQLdb()
        

    Django orm使用

    我们在django中使用orm时,orm并不会帮你自动创建数据库,还是需要我们手动指定一个django项目用一个数据库

    ORM对象关系映射

    表的创建

    		在应用名下的models.py中书写模型类
    
    orm中常用字段
    AutoField(primary_key = True)	用于设置主键
    
    CharField(max_length = re)	用于设置字符类型的字段,必须要有max_length参数
    
    IntegerField()		用于设置数字类型字段
    
    BigIntergerField()		用于设置可以存放大个的数字类型
    
    DateField() 	用于设置日期字段
    	auto_now:每次修改数据时,都会更新该字段
    	auto_now_add:只在创建数据的时候 才会自动将创建时间添加 后续不会自动修改
    	
    BooleanField(field)
    	-波尔类型值
    	在使用该字段存储数据的时候,你只需要传递布尔值
    	在数据库中会自动变为0/1
    	
    TextField(Field) 文本类型,用于存放大字段
    
    EmailField(CharField)	用于存放邮箱
    
    FileField(Field)
    -字符串,路径保存在数据库
    -参数:
    	upload_to = ""	上传文件保存的路径
    	storage = None	存储组件,默认django.core.files.FileSystem
    	
    DecimalField(Field)
    -10进制小数
    -必须设置的参数:
    	max_digits	小数总长度
    	decimal_places	小数位长度
    

    orm表创建

    在应用名下的models.py中书写模型类

    class User(models.Model):
    	id = model.AutoField(primary_key = Ture) #为表设置主键,在django中 你可以不指定主键字段,rom会自动为你创建id的主键字段
    	username = model.CharField(max_length=32) #设置username字段
    
    
    ***********************************数据库迁移命令**************************************
    1.python.manage.py makemigrations #并不会真正操作数据 只是将记录记录到小本本上
    2.python manage.py migrate #将真正的记录同步到数据库中
       # 当你第一次执行上面两条命令的时候 django会自动创建很多张表  这些表都是django默认需要用到的表
            # 你自己写的模型类所对应的表 表名有固定格式
                应用名_表名
    

    如何查看使用ORM时,内部得真正得sql语句

    方案一

    在settings文件中配置
     LOGGING = {
                    'version': 1,
                    'disable_existing_loggers': False,
                    'handlers': {
                        'console': {
                            'level': 'DEBUG',
                            'class': 'logging.StreamHandler',
                        },
                    },
                    'loggers': {
                        'django.db.backends': {
                            'handlers': ['console'],
                            'propagate': True,
                            'level': 'DEBUG',
                        },
                    }}
    

    方案二

    • 如果时queryset对象,可以直接点query查看

    ps:只要时queryset对象就可以无限制的店queryset对象的方法

    如何在单个py文件下测试ORM

    在test.py下面
    1. import os
    2.if __name__ == "__main__"
    	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings")
            import django
            django.setup()
            #这样即可测试django中的py文件
    

    ORM增删改查

    单表操作

    单表查询:

    ORM查询之必知必会13条

    1. all()查询所有

      惰性查询,不打印不传值

    2. filter()模糊查询

    3. get()数据本身

    4. first()第一个

    5. last()最后一个

    6. exclude()除此之外

    7. values()列表套字典

    8. values_list()列表套元组

    9. count()统计数据的个数

    10. distinct()去重

    11. order_by()排序,默认升序,加负号就是降序

    12. reverse()必须先进行排序才可以反转

    13. exists()可以不用记

    ORM查询之双下滑线查询

    1. res = models.Book.objects.filter(price__gt = 200)查询价格大于200的书籍
    2. res = models.Book.objects.filter(price__lt = 200)查询价格小于200的书籍
    3. res = models.Book.objects.filter(price__gte = 200)查询价格大于等于200的书籍
    4. res = models.Book.objects.filter(price__lte = 200)查询价格小于等于200的书籍
    5. res = models.Book.objects.filter(price__in = [200,123,23,666.66])价格是200123,或23,或666.66的书籍
    6. res = models.Book.objects.filter(price__range = (200,666.66)顾头不顾尾,查询价格在200到700之间的书籍
    7. res = models.Book.objects.filter(title__contains = 'p')查询书籍名称中包含p
    8. res = models.Book.objects.filter(title__icontains = 'p')忽略大小写,只要包含p的都查询出来
    9. res = models.Book.objects.filter(title__startswith = '三')查询书籍以三开头
    10. res = models.Book.objects.filter(title__endswith = '三')查询书籍以三结尾
    11. res = models.Book.objects.filter(publish_date__year = '2019')查询出版日期是2019的书籍

    1. models.Book.objects.create(title='瓜皮之书',price = 200,publish_date='2019-10-24')
    2. book_obj = models.Book.(title='瓜皮之书',price = 200,publish_date='2019-10-24')
      book_obj.save()

    删除

    models.Book.objects.filter(pk=1).delete()

    1. models.Book.objects.filter().update()

    2. #先查对象
      book_obj = models.Book.objects.filter(pk=1).first()
      #给属性赋值
      book_obj.title = '不符合社会主义核心价值观'
      使用方法保存
      book_obj.save()
      

    多表操作

    ORM之多表操作之增

    # models.Book.objects.create(title='三国演义',price=123.23,publish_id=1)  # publish_id直接传出版社主键值
    # publish_obj = models.Publish.objects.filter(pk=2).first()
    # models.Book.objects.create(title='水浒传',price=123.23,publish=publish_obj)  # publish直接传出版社数据对象
    
  • 相关阅读:
    Mysql事后触发器练习
    基础算法2.1——枚举法
    JSP第二次作业:使用session记录次数的猜数游戏
    JSP第一次作业:使用Cookie记录用户上次访问时间
    Python数据清洗见闻
    Python作业碎碎念
    数组那些事儿
    %1e9+7问题收录
    DB2数据库关于delete in id和batch delete的性能对比
    关于sql知识全面总结
  • 原文地址:https://www.cnblogs.com/ledgua/p/11754405.html
Copyright © 2011-2022 走看看