之前的简单预习,重点在后面
方式一:
# create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象
book_obj
=
Book.objects.create(title
=
"python葵花宝典"
,state
=
True
,price
=
100
,publish
=
"苹果出版社"
,pub_date
=
"2012-12-12"
)
book_obj
=
Book(title
=
"python葵花宝典"
,state
=
True
,price
=
100
,publish
=
"苹果出版社"
,pub_date
=
"2012-12-12"
)
book_obj.save() # 对象.save()是必须有的
book_obj
=
Book.objects.方法(参数视方法而定
)
1 <1> all(): 查询所有结果 2 3 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 4 5 <3> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个, 6 如果符合筛选条件的对象超过一个或者没有都会抛出错误。 7 8 <4> exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 9 10 <5> order_by(*field): 对查询结果排序 11 12 <6> reverse(): 对查询结果反向排序 13 14 <8> count(): 返回数据库中匹配查询(QuerySet)的对象数量。 15 16 <9> first(): 返回第一条记录 17 18 <10> last(): 返回最后一条记录 19 20 <11> exists(): 如果QuerySet包含数据,就返回True,否则返回False 21 22 <12> values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列 23 model的实例化对象,而是一个可迭代的字典序列 24 <13> values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列 25 26 <14> distinct(): 从返回结果中剔除重复纪录
基于双下划线的模糊查询
1 Book.objects.filter(price__in=[100,200,300]) 2 Book.objects.filter(price__gt=100) 3 Book.objects.filter(price__lt=100) 4 Book.objects.filter(price__range=[100,200]) 5 Book.objects.filter(title__contains="python") 6 Book.objects.filter(title__icontains="python") 7 Book.objects.filter(title__startswith="py") 8 Book.objects.filter(pub_date__year=2012)
删除表记录
开始我们直接注释,然后makemigrations==》migrate直接刷入,下面直接调用封装的方法,更简便一点
注意一点:不能直接调用表名.objects进行删除!!!看下面
1 删除方法就是 delete()。它运行时立即删除对象而不返回任何值。例如: 2 3 4 model_obj.delete() 5 你也可以一次性删除多个对象。每个 QuerySet 都有一个 delete() 方法,它一次性删除 QuerySet 中所有的对象。 6 7 例如,下面的代码将删除 pub_date 是2005年的 Entry 对象: 8 9 Entry.objects.filter(pub_date__year=2005).delete() 10 在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象。例如: 11 12 13 b = Blog.objects.get(pk=1) 14 # This will delete the Blog and all of its Entry objects. 15 b.delete() 16 要注意的是: delete() 方法是 QuerySet 上的方法,但并不适用于 Manager 本身。这是一种保护机制,是为了避免意外地调用 Entry.objects.delete() 方法导致 所有的 记录被误删除。如果你确认要删除所有的对象,那么你必须显式地调用: 17 18 19 Entry.objects.all().delete() 20 如果不想级联删除,可以设置为: 21 22 23 pubHouse = models.ForeignKey(to='Publisher', on_delete=models.SET_NULL, blank=True, null=True)
修改表记录
Book.objects.filter(title__startswith="py").update(price=120)
此外,update()方法对于任何结果集(QuerySet)均有效,这意味着你可以同时更新多条记录update()方法会返回一个整型数值,表示受影响的记录条数。
加上笔记的Django中单表的详细操作
将models里面创建的表存储到mysql数据库中,应当在settings进行设置
1 DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.mysql', 4 'NAME': 'lqz', 5 'USER': 'root', 6 'PASSWORD': '123456', 7 'HOST': '127.0.0.1', 8 'PORT': 3306, 9 'ATOMIC_REQUEST': True, 10 'OPTIONS': { 11 "init_command": "SET storage_engine=MyISAM", 12 } 13 } 14 } 15 ''' 16 'NAME':要连接的数据库,连接前需要创建好 17 'USER':连接数据库的用户名 18 'PASSWORD':连接数据库的密码 19 'HOST':连接主机,默认本机 20 'PORT':端口 默认3306 21 'ATOMIC_REQUEST': True, 22 设置为True统一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败)。 23 是全局性的配置, 如果要对某个http请求放水(然后自定义事务),可以用non_atomic_requests修饰器 24 'OPTIONS': { 25 "init_command": "SET storage_engine=MyISAM", 26 } 27 设置创建表的存储引擎为MyISAM,INNODB 28 '''
设置完后,再启动我们的Django项目前,我们需要激活我们的mysql。然后,启动项目,会报错:no module named MySQLdb 。这是因为django默认你导入的驱动是MySQLdb,可是MySQLdb 对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入:
import pymysql pymysql.install_as_MySQLdb()
最后通过两条数据库迁移命令即可在指定的数据库中创建表 :
python manage.py makemigrations
python manage.py migrate
确保配置文件中的INSTALLED_APPS中写入我们创建的app名称,要确保添加在installed_apps.
如果想打印orm转换过程中的原生sql,需要在settings中进行如下配置:
1 LOGGING = { 2 'version': 1, 3 'disable_existing_loggers': False, 4 'handlers': { 5 'console':{ 6 'level':'DEBUG', 7 'class':'logging.StreamHandler', 8 }, 9 }, 10 'loggers': { 11 'django.db.backends': { 12 'handlers': ['console'], 13 'propagate': True, 14 'level':'DEBUG', 15 }, 16 } 17 }
增加,删除字段
删除,直接注释掉字段,执行数据库迁移命令即可,如果想直接删除整个表,直接把整个表注释掉,再执行数据库迁移命令。
新增字段,在类里直接新增字段,直接执行数据库迁移命令会提示输入默认值,此时需要设置之前已经创建记录的默认值,如下:
publish = models.CharField(max_length=12,default='人民出版社',null=True)
注意:
1 数据库迁移记录都在 app01下的migrations里
2 使用showmigrations命令可以查看没有执行migrate的文件
3 makemigrations是生成一个文件,migrate是将更改提交到数据量
如果需要在Django环境中的文件里右击直接执行对表的增删改查,需要在文件里加上一段代码
在python中调用django环境
django.setup()是启动django
1 import os 2 if __name__ == '__main__': 3 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled2.settings") 4 import django 5 django.setup() 6 from app01.models import *
代码演示文件:settings views 和models
settings
1 """ 2 Django settings for untitled2 project. 3 4 Generated by 'django-admin startproject' using Django 1.11. 5 6 For more information on this file, see 7 https://docs.djangoproject.com/en/1.11/topics/settings/ 8 9 For the full list of settings and their values, see 10 https://docs.djangoproject.com/en/1.11/ref/settings/ 11 """ 12 13 import os 14 15 # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 18 # Quick-start development settings - unsuitable for production 19 # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ 20 21 # SECURITY WARNING: keep the secret key used in production secret! 22 SECRET_KEY = '^i6$8rw-6o+i%23ojoco1-9khepwdw!h=(+3j_$ubltrptho=!' 23 24 # SECURITY WARNING: don't run with debug turned on in production! 25 DEBUG = True 26 27 ALLOWED_HOSTS = [] 28 29 # Application definition 30 31 INSTALLED_APPS = [ 32 'django.contrib.admin', 33 'django.contrib.auth', 34 'django.contrib.contenttypes', 35 'django.contrib.sessions', 36 'django.contrib.messages', 37 'django.contrib.staticfiles', 38 'app01.apps.App01Config', 39 ] 40 41 MIDDLEWARE = [ 42 'django.middleware.security.SecurityMiddleware', 43 'django.contrib.sessions.middleware.SessionMiddleware', 44 'django.middleware.common.CommonMiddleware', 45 # 'django.middleware.csrf.CsrfViewMiddleware', 46 'django.contrib.auth.middleware.AuthenticationMiddleware', 47 'django.contrib.messages.middleware.MessageMiddleware', 48 'django.middleware.clickjacking.XFrameOptionsMiddleware', 49 ] 50 51 ROOT_URLCONF = 'untitled2.urls' 52 # ROOT_URLCONF = 'app01.urls' 53 54 TEMPLATES = [ 55 { 56 'BACKEND': 'django.template.backends.django.DjangoTemplates', 57 'DIRS': [os.path.join(BASE_DIR, 'templates')] 58 , 59 'APP_DIRS': True, 60 'OPTIONS': { 61 'context_processors': [ 62 'django.template.context_processors.debug', 63 'django.template.context_processors.request', 64 'django.contrib.auth.context_processors.auth', 65 'django.contrib.messages.context_processors.messages', 66 ], 67 }, 68 }, 69 ] 70 71 WSGI_APPLICATION = 'untitled2.wsgi.application' 72 73 # Database 74 # https://docs.djangoproject.com/en/1.11/ref/settings/#databases 75 76 DATABASES = { 77 # 'default': { 78 # 'ENGINE': 'django.db.backends.sqlite3', 79 # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 80 # } 81 'default': { 82 'ENGINE': 'django.db.backends.mysql', 83 'NAME': 'dj1', 84 'HOST': '127.0.0.1', 85 'PORT': 3306, 86 'USER': 'root', 87 'PASSWORD': '123' 88 } 89 } 90 91 # Password validation 92 # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators 93 94 AUTH_PASSWORD_VALIDATORS = [ 95 { 96 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 97 }, 98 { 99 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 100 }, 101 { 102 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 103 }, 104 { 105 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 106 }, 107 ] 108 109 # Internationalization 110 # https://docs.djangoproject.com/en/1.11/topics/i18n/ 111 112 LANGUAGE_CODE = 'en-us' 113 114 TIME_ZONE = 'UTC' 115 116 USE_I18N = True 117 118 USE_L10N = True 119 120 USE_TZ = True 121 122 # Static files (CSS, JavaScript, Images) 123 # https://docs.djangoproject.com/en/1.11/howto/static-files/ 124 125 STATIC_URL = '/static/' 126 STATICFILES_DIRS = [ 127 os.path.join(BASE_DIR, 'static') 128 ] 129 130 LOGGING = { 131 'version': 1, 132 'disable_existing_loggers': False, 133 'handlers': { 134 'console':{ 135 'level':'DEBUG', 136 'class':'logging.StreamHandler', 137 }, 138 }, 139 'loggers': { 140 'django.db.backends': { 141 'handlers': ['console'], 142 'propagate': True, 143 'level':'DEBUG', 144 }, 145 } 146 }
views
1 import os 2 if __name__ == '__main__': 3 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled2.settings") 4 import django 5 django.setup() 6 from app01.models import * 7 8 import datetime 9 10 now = datetime.datetime.now() 11 # *****增加******* 12 # 第一种方式:(推荐用第一种)date类型需要注意:传字符串必须是:2014-09-18,也可以传datetime类型 13 # book=Book.objects.create(name='红楼梦',price=12.1,pub_date='2014-09-18',publish_id = 1) 14 # Book.objects.create(name='水浒传',price=17.1,pub_date=now,publish_id=2) 15 # print(book,type(book)) # Book object <class 'app01.models.Book'> 16 # print(Book.objects,type(Book.objects)) # app01.Book.objects <class 'django.db.models.manager.Manager'> 17 # 第二种方式 18 # book=Book(name='Pyhon开发',price=50,pub_date='2017-09-18',publish_id = 1) 19 # book.save() 20 # print(book) 21 # *****查filter(--queryset对象)相当于sql的where 后面传的参数,都是and 22 # books=Book.objects.filter(name='红楼梦',nid=3) 23 # print(books) # <QuerySet [<Book: Book object>]> 24 # print(books.first().nid) # books是一个queryset类型,通过first方法取出里面的对象,获得对象的nid值。 25 # print(books[0].nid) 26 # all() 拿所有的--queryset对象 27 # books = Book.objects.all() # 还是一个queryset类型 但是包含了所有的BOOK对象 28 # print(books) 29 # first() 从queryset里取出第一个值---->book对象 30 # books = Book.objects.all().first() 31 # print(books) 32 # get只能用来查,返回一条数据的情况,数据多,数据少,都报错 33 # book=Book.objects.get(name='Python开发')#会报错 因为会返回多条数据 34 # print(book) 35 # values 对应到sql相当于 select 这里的东西 from book---返回QuerySet对象 36 # book=Book.objects.all().values('name','price').first() 37 # book0=Book.objects.all().values('name','price') 38 # book1=Book.objects.all().values().first() # 不指定字段默认所有字段 39 # print(book0) 40 # # 字典里有name和price的queryset类型对象集合。 41 # print(book) 42 # print(book1) 43 # 一旦返回是queryset对象,可以继续点它的方法 44 # book=Book.objects.all().values('name','price').filter(name='Pyhon开发').filter(id=4).values('id') 45 # print(book) 46 # exclude 除XX以外的 47 # books=Book.objects.all().exclude(name='红楼梦').first().nid 48 # print(books) 49 # order_by 默认从小到大,想从大到小 (负号-) 50 # books=Book.objects.all().order_by('price').first().nid 51 # book1s=Book.objects.all().order_by('-price').first().nid 52 # print(books,type(books)) 53 # print(book1s,type(book1s)) 54 # count ---count后面不能继续点了 55 # count=Book.objects.all().count() 56 # print(count) 57 # last() 58 # Book.objects.all().last() 59 # Book.objects.all()[-1] #报错 60 # exists 判断queryset里有没有数据,没有就是false,有就是true 61 # ret=Book.objects.all().exists() 62 # print(ret) 63 # values_list 对比values:values_list:queryset里放元组, values:queryset里放字典 64 # books=Book.objects.all().values_list('name','price') 65 # print(books) 66 # distinct 67 # ret=Book.objects.values('publish').distinct() 68 # print(ret) 69 # 无意义 70 # ret = Book.objects.all().distinct() 71 # print(ret) 72 73 # reverse 对查询结果反向排序 74 # books = Book.objects.all().order_by('-price').reverse() 75 # # 相当于 76 # books = Book.objects.all().order_by('price') 77 # books = Book.objects.all().order_by('-price', 'pub_date').reverse() 78 # # 相当于 79 # books = Book.objects.all().order_by('price', '-pub_date') 80 # print(books) 81 82 # ret=Book.objects.all().get(pk=1) 83 # ret=Book.objects.get(pk=1) 84 # ret=Book.objects.get(price=51) 85 # ret=Book.objects.get(pk=100) 86 # ret=Book.objects.filter() 87 # ret=Book.objects.all().exclude(name='红楼梦') 88 # ret 是queryset对象,query方法, 89 # print(ret.query) # query方法 90 # print(ret) 91 # from django.db.models.manager import Manager 92 # 默认升序 93 # ret=Book.objects.all().order_by('price') 94 # ret=Book.objects.all().order_by('-price','id') 95 # ret=Book.objects.all().order_by('-price','id').reverse() 96 # ''' 97 # SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`pub_date`, `app01_book`.`author`, `app01_book`.`publish` FROM `app01_book` ORDER BY `app01_book`.`price` DESC, `app01_book`.`id` ASC 98 # ''' 99 # 单纯用reverse没有效果 100 # ret=Book.objects.all().reverse().first().name 101 # ret1=Book.objects.all().first().name 102 # print(ret,ret1) 103 # ret1 = Book.objects.all().order_by('-price', 'nid').first().nid 104 # ret2 = Book.objects.all().order_by('-price', 'nid').reverse().first().nid 105 # # 相当于 106 # ret2 = Book.objects.all().order_by('price', '-id') 107 # print(ret1) 108 # print(ret2) 109 # ret=Book.objects.all().filter(price='51').count() 110 # print(ret) 111 # queryset对象来调用,返回布尔值 112 # ret=Book.objects.filter(pk=100).exists() 113 # print(ret) 114 # values queryset对象来调用 115 # 这是错误的 116 # ret=Book.objects.all().first().values(*('name','price')) # 变量解压,随机打散 117 # print(ret) 118 # 拿到元祖 119 # ret=Book.objects.all().values_list('name','price').filter(name='水浒传') 120 # print(ret) 121 # distinct 122 # ret=Book.objects.all().values('price').distinct() 123 # print(ret) 124 # 基于双下划线的模糊查询 125 # 以XX开头 126 # ret=Book.objects.all().filter(name__startswith='红') 127 # print(ret) 128 #以XX结尾 129 # ret=Book.objects.all().filter(name__endswith='传') 130 # print(ret) 131 # 包含XX 对应到sql# like %传% 132 # ret=Book.objects.all().filter(name__contains='传') 133 # print(ret) 134 # icontains 不区分大小写 135 # ret=Book.objects.filter(name="pyhon开2") # filter可以用于queryset和manager对象 136 # # ret=Book.objects.filter(name__icontains="pyhon") 137 # print(ret) 138 # 大于小于 139 # ret=Book.objects.filter(price__gt='16') 140 # ret=Book.objects.filter(price__lt='16') 141 # ret=Book.objects.filter(price__lte='16') 142 # ret=Book.objects.filter(price__gte='16') 143 # ret1=Book.objects.filter(price__range=[1,100]) 144 # ret2 = Book.objects.filter(price__gte=1,price__lte=100) 145 # print(ret1) 146 # print(ret2) 147 # 查询id在后面列表里的数据 148 # ret=Book.objects.filter(id__in=[1,2,3,100]) 149 # print(ret) 150 # ret=Book.objects.filter(id__range=[1,4]) 151 # print(ret) 152 # ret=Book.objects.filter(pub_date__year=2017) 153 # ret=Book.objects.filter(pub_date__year__gt=2017) 154 # ret=Book.objects.filter(pub_date__month__gt=3) 155 # ret=Book.objects.filter(pub_date__day__in=[18,7]) 156 # ret=Book.objects.filter(pub_date__month=1) 157 # print(ret) 158 # 删除 159 # queryset对象可以调用,对象可以调用 160 # ret=Book.objects.filter(name='水浒传').delete() 161 # ret=Book.objects.filter(name='红楼梦').first().delete() 162 # (1, {'app01.Book': 1}) 1 影响一条记录 那个表的记录 1 影响这个表的记录 163 # print(ret) 164 # 这不可以 manager对象 165 # ret=Book.objects.delete() 166 # 这个可以 167 # ret=Book.objects.all().delete() 168 # 更新 返回结果是int类型,只能queryset对象来调,对象不能来调 169 # ret=Book.objects.all().filter(price=51) 170 # ret=Book.objects.all().filter(price=51).update(name='后楼梦') 171 # ret=Book.objects.all().filter(price=51).first() 172 # ret.update(name='水浒传') 173 # print(ret)
models
1 from django.db import models 2 3 # Create your models here. 4 5 6 # class Book(models.Model): 7 # name=models.CharField(max_length=32) 8 # price=models.DecimalField(max_digits=5,decimal_places=2) 9 # pub_date=models.DateField() 10 # 11 # author=models.CharField(max_length=32) 12 # publish=models.CharField(max_length=64) 13 # 14 # def __str__(self): 15 # return self.name 16 17 class Publish(models.Model): 18 nid=models.AutoField(primary_key=True) 19 name=models.CharField(max_length=32) 20 addr=models.CharField(max_length=64) 21 email=models.EmailField() 22 23 class Author(models.Model): 24 nid=models.AutoField(primary_key=True) 25 name=models.CharField(max_length=32) 26 age=models.IntegerField() 27 # 一对一的关系,就要用onetoone,关联字段放在那都可以 28 # 不能用ForeignKey建立一对一的关系原因是:ForeignKey建立的外键不是唯一的,需要自己设置,不如onetoone直接 29 # 而且onetoone容易让别人一眼看出他们是什么关系。比如作者和他的详细信息,插入的时候如果用FOREIGNKEY,那么可以在 30 # 关联的字段插入相同的ID,但是一对一关系的表都是一一对应的,所以这就造成了容易出错且不会报错的情况。 31 # authordatil=models.ForeignKey(to='AuthorDetail',to_field='nid',unique=True) 32 authordatil=models.OneToOneField(to='AuthorDetail',to_field='nid') 33 34 class AuthorDetail(models.Model): 35 nid=models.AutoField(primary_key=True) 36 phone=models.CharField(max_length=32) 37 email=models.EmailField() 38 39 class Book(models.Model): 40 nid=models.AutoField(primary_key=True) 41 price=models.DecimalField(max_digits=5,decimal_places=2) 42 pub_date=models.DateField() 43 name=models.CharField(max_length=32,null=True) 44 45 # 一旦确立的一对多的关系,关联字段一定要放在多的表 46 publish=models.ForeignKey(to='Publish',to_field='nid') 47 # 一旦确立多对多的关系,管理字段放在哪都可以 48 authors=models.ManyToManyField(to='Author') 49 # django 它会创建第三张表,表里有三个字段 id book_id author_id 并且会做外键关联