Django中对单表的增删改查

之前的简单预习,重点在后面

方式一:

# 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()是必须有的
 
推荐用方式一
 
查询数据库常用的方法 ==》和查询请求体里面属性不同,注意区分, 查询请求体request.POST是一个queryset,这里用get方法查不到值默认返回None,而查询数据库get不到对象会直接报错。
  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 }
settings

 

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)
views

 

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  并且会做外键关联
models

 

 

 

 

 

 

posted @ 2018-09-07 20:18  Roc_Atlantis  阅读(203)  评论(0编辑  收藏  举报