标签:mysq 提前 port content root 简单的 oca mina 因此
ORM
————对象关系映射(Object Relational Mapping),它实现了数据模型与数据库的解耦,即数据模型的设计。利用它我们不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。SQL中建表语句
与ORM中建表的类
进行对比,便于大家对后面知识点的理解:whw
的数据库:create database whw;
whw_dj_ORM
,在这这个项目中新建一个应用book
:python manage.py startapp book
。INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
#前面是既有的,这个book是新加的
‘book‘,
]
models.py
文件中加入下面建表的类的代码(如果没有名字必须命名为models):from django.db import models
class Book(models.Model):
#AutoField为自增对象,括号里面的是限定条件
id = models.AutoField(primary_key=True)
#CharField为一个字符串,括号里面表示它的最大长度
title = models.CharField(max_length=32)
state = models.BooleanField()
#DateField是存日期的
pub_date =models.DateField()
#DecimalField是一个浮点型:max_digits为最大的位数,但是有两位是小数——111111.11
price = models.DecimalField(max_digits=8,decimal_places=2)
publish = models.CharField(max_length=32)
def __str__(self):
return self.title
settings
中配置,需要注意的是创建数据库的时候这些参数都有设置的,而且下面的参数是连接本机的数据库,如果要连接远程数据库就需要远程数据库的ip 端口等信息了。DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘,#引擎,选mysql
‘NAME‘:‘whw‘, # 要连接的数据库,连接前需要创建好
‘USER‘:‘root‘, # 连接数据库的用户名
‘PASSWORD‘:‘123‘, # 连接数据库的密码
‘HOST‘:‘127.0.0.1‘, # 连接主机,默认本本机
‘PORT‘:3306 # 端口 默认3306
}
}
import pymysql
pymysql.install_as_MySQLdb()
A:在python与django的安装路径找到:C:\Users\dell\AppData\Local\Programs\Python\Python36\Lib\site-packages\django\db\backends\mysql
B:将里面的base.py文件中的
if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
这句话注释掉!!!
python manage.py makemigrations
python manage.py migrate
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‘,
},
}
}
book_obj=models.Book.objects.create(title=‘Python葵花宝典‘,state=True,price=100,publish=‘苹果出版社‘,pub_date=‘2015-12-13‘)
print(book_obj.title)
book_obj=Book(title="python葵花宝典",state=True,price=100,publish="苹果出版社",pub_date="2012-12-12")
book_obj.save()
all()
——将查询出来的查询出来的所有对象放在列表中。models.Book.objects来调用,返回的是QuerySet类型的对象book_list = models.Book.objects.all()
print(book_list)
for i in book_list:
print(i.title,i.price)
print(book_list[0].pub_date)
first
与last
——返回值不是QuerySet对象,而是model对象,等价于book_list[0]或book_list[-1]。调用者是QuerySet对象。book_first = models.Book.objects.first()
print(book_first)
filter
——功能跟SQL语句中的where
一样,用来“过滤数据”。调用者objects,返回值是QuerySet对象。book_list2 = models.Book.objects.filter(price=100)
print(book_list2)
book_list2_more = models.Book.objects.filter(price=100,title=‘西游记‘)
print(book_list2_more)
get
——很像filter,但是,get方法有且只有一个查询结果是才有意义;如果有多个查询结果会报错!返回值是一个model对象,利用objects调用!book_get = models.Book.objects.get(title=‘西游记‘)
print(book_get)
exclude
——排除。得到的是个QuerySet对象,由objects调用。book_exclude = models.Book.objects.exclude(title=‘西游记‘)
print(book_exclude)
order_by
——排序。###得到的是QuerySet对象,由objects调用。book_order_by_asc = models.Book.objects.order_by(‘title‘)
print(‘升序:‘,book_order_by_asc)
book_order_by_desc = models.Book.objects.order_by(‘-title‘)
print(‘降序:‘,book_order_by_desc)
book_order_by1 = models.Book.objects.order_by(‘title‘,‘price‘)
print(‘两个字段排序:‘,book_order_by1)
reverse
——反转。可以在order_by的基础上加上reverse:book_reverse = models.Book.objects.order_by(‘title‘).reverse()
print(‘排序反转:‘,book_reverse)
count
——计数。返回int类型的数据,调用者是QuerySet。count = models.Book.objects.all().count()
print(‘数据的总数:‘,(count,type(count)))
exists
——检测是否存在记录。如果想要判断表中有无数据,不加exists则表示取出来所有的值了,没必要取所有的值,这样效率不高;加上exists相当于利用limit限制只取出来一条数据去判断有没有记录。ret = models.Book.objects.all().exists()
if ret:
print(‘OK!有数据!‘)
values(*field)
——得到的是一个QuerySet对象,由QuerySet对象调用。如果我们想对查询出来的QuerySet对象进行进一步的筛选可以用它。比如说查询所有书籍的名称:book_titles = models.Book.objects.all().values(‘title‘)
print(‘所有书籍的名称:‘,book_titles)
values
很重要,这里给出它的原理:temp = []
for obj in models.Book.objects.all()
temp.append(
‘title‘:obj.title,
)
return temp
book_title_1_title = book_titles[1].get(‘title‘)
print(‘第二个书籍的名字:‘,book_title_1_title)
values_list(*field)
——与value方法一样,调用者与返回值均是QuerySet对象。但是,value_list的结果是列表里面嵌套元组:book_values_list = models.Book.objects.all().values_list(‘title‘)
print(book_values_list)
distinct
——去重。price_distinct = models.Book.objects.all().values(‘price‘).distinct()
print(‘price去重:‘,price_distinct)
filter
过滤。__gt
gt_100 = models.Book.objects.filter(price__gt=100)
print(‘价格大于100的:‘,gt_100)
__lt
lt_10000 = models.Book.objects.filter(price__lt=10000)
print(‘价格小于10000的:‘,lt_10000)
__in
price_in = models.Book.objects.filter(price__in=[100,200,300])
print(‘价格包含:‘,price_in)
__startswith
title_starts_xi = models.Book.objects.filter(title__startswith=‘西‘)
print(‘title以西字开头:‘,title_starts_xi)
__contains
title_contains = models.Book.objects.filter(title__contains=‘p‘)
print(‘title包含p的:‘,title_contains)
__icontains
title_icontains = models.Book.objects.filter(title__icontains=‘p‘)
print(‘title包含p或者P的:‘,title_icontains)
__range
price_range = models.Book.objects.filter(price__range=[100,10000])
print(‘价格在一个范围之内:‘,price_range)
__year
、__month
等。过滤一下出版日期是2014年的数据:pub_date_2014 = models.Book.objects.filter(pub_date__year=2014)
print(‘2014出版的数据:‘,pub_date_2014)
delete
models.Book.objects.filter(price=100).delete()
models.Book.objects.filter(price=100).first().delete()
update
models.Book.objects.filter(title=‘西游记‘).update(title=‘西游降魔篇‘)
标签:mysq 提前 port content root 简单的 oca mina 因此
原文地址:https://www.cnblogs.com/paulwhw/p/9395085.html