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直接传出版社数据对象
原文地址:https://www.cnblogs.com/ledgua/p/11754405.html