model(数据库模型)配置,ORM 单表操作

model(数据库模型)------ ORM(object relation mapping)

1.仅限Django 自带
2.orm可以避免新手写sql语句带来的性能问题
3.orm搬迁是非常容易的 调换数据库容易不需要改代码


1.通过pymysql(原生sql)
2.orm-通过类的实例来进行与数据库交互 (一个类为表,一个实例就是一个记录,
属性为表中数据)


Django配置mysql

1. settings.py :
把原来的 DATABASES 隐藏
DATABASES = {
'default':{
'ENGINE':'django.db.backends.mysql',
'NAME':''      #数据库名称
'USER':'root'  #用户名
'PASSWORD':''  #数据库密码
'HOST': ''     #主机,默认为localhost
'PORT':'3306'  #端口
}
}


2. 在项目__init__.py 中添加:
import pymysql 
pymysql.install_as_MySQLdb()


3. 在app包下models.py创建表
必须继承(models.Model)

class Book(models.Model):
name = models.CharField(max_length=20)   // CharField字符串类型
price = models.IntegerField()   // IntegerField 整数
pub_date = models.DateField()  // DateField 时间类型


获取字段
b = Book()
b.id


4. 运行命令
python manage.py makemigrations (在migrations包下出现0001_initial.py 文件)
python manage.py migrate (生成很多张表默认创建一些表)
表名 == 项目名加表名


=======查看表记录翻译为sql语句 可以在settings.py 文件中添加LOGGING
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

惰性求值 

Publish.objects.all() 或者 .frlter() 等都只是返回了一个 QuerySet(查询结果集对象)
并不会马上执行sql,而是等到调用 QuerySet的时候才会执行
QuerySet 可迭代 可切片

把 QuerySet对象变为 可迭代对象 .iterator()  迭代器只能取一遍
ret = Publish.objects.all().iterator()
for i in ret:
print(i)

单表操作
表记录操作

1. 引入到视图views.py中  import app01.models import *


注意:前端input传过来的name值和用户输入值,写入数据库的是字典(**dic)
第一种添加: 
def  add(req):
b = Book(name='qq',price=10,pub_date='2011-1-1')
b.save()
return HttpResponse('添加成功')
第二种添加:(不用关闭)
def add(req):
Book.objects.create(name='qq',price=10,pub_date='2011-1-1')
return HttpResponse('添加成功')


第一种替换: 
def  update(req):
b = Book.objects.get(name='qq')  # get 返回的是实例对象
#print(b) # QuerySet 对象集合
b.price = 99
b.save()
return HttpResponse('修改成功')
**建议使用 update效率更高
第二种替换:(不用关闭)

def update(req):
Book.objects.filter(name='qq').update(price=99)  # update是uerySet对象
return HttpResponse('修改成功')


删除:
def dele(req):
Book.objects.filter(name='qq').delete()
return HttpResponse('删除成功')




查询:

def select(req):
***book_list = Book.objects.all()  # 可以进行切片 取几条
book_list = Book.objects.all()[::2]
  book_list = Book.objects.first()  # 第一个
book_list = Book.objects.last()  # 最后一个
book_list = Book.objects.get(id=1)  # 只有是一条的才会查询出来 否则会报错
**book_list = Book.objects.filter(name='q').values('price')  # 取出name为q的price 返回字典类型 
book_list = Book.objects.filter(name='q').values('price','pub_date')   # 取出name为q的 两个属性
book_list = Book.objects.filter(name='q').values_list('price')     # 返回列表类型没有键
book_list = Book.objects.exclude(name='q')    # 取反 取name为q的 其他值             
return reder(req,'index.html',{'book_list':book_list})


order_by 对查询结果排序
reverse  反转  对查询结果反向排序
****Book.objects.all().values('name').distinct()  从返回结果中剔除重复记录
values_list 返回元组  values返回字典
count 返回数据库中匹配查询的对象数量
exists  如果QuerySet包含数据 就返回True,否则返回False



模糊查询:

万能的双下划线 __
Book.objects.filter(price__gt=50).values('name','price')  
查询price小于50的
Book.objects.filter(name__icontanins="P").values('name','price')
加i不区分大小写 查询name包含P的
__lt 大于 
Book.objects.filter(id__in[1,2,3])  id 等于1,2,3 的值
range=[1,2] 范围  
startwith istartwith  以什么开头
endswith  iendswith   以什么结尾


模版语言取不到的不报错 只是不显示
HTML循环:
{% for book in book_list %}
{{ book.name }} {{ book.price }}

{% endfor %}

多关键字查询

F查询 Q查询

from django.db.models import Q,F


只能满足且的操作 and
Book.objects.get(price=77)  只能根据一个关键字查询


F查询: 查询对象多个内容
Book.objects.all().update(price=F('price')+10)
Q查询:可以添加多个条件
Book.objects.filter(Q(name='q'))


或(|) 非(^) 

Book.objects.filter(Q(name='q'),Q(name='w'))
Book.objects.filter(Q(name='q')|Q(name='w'))

组合使用

Book.objects.filter(Q(name='q'),price=22)

你可能感兴趣的:(Django)