Q和F
-
F使用查询条件的值,专门取对象中某列值的操作
from django.db.models import F
models.Tb1.objects.update(num=F('num')+1)
-
Q 构建搜索条件
通常,Q()对象
使得定义查询条件然后重用成为可能。 它允许使用|
(OR
)和&
(AND
)操作[构建复杂的数据库查询]否则在特定情况下,QuerySets
使用不了OR
。
from django.db.models import Q
q1=models.Book.objects.filter(Q(title__startswith='P')).all()
print(q1)#[<Book: Python>, <Book: Perl>]
# 可以组合使用&,|操作符,当一个操作符是用于两个Q的对象,它产生一个新的Q对象。
Q(title__startswith='P') | Q(title__startswith='J')
Q对象可以用~操作符放在前面表示否定,也可允许否定与不否定形式的组合
Q(title__startswith='P') | ~Q(pub_date__year=2005)
一.创建表
-
继承
from django.db import models
-
注册app,在setting.py
INSTALLED_APPS
注册 -
写表的类
-
分别输入
python manage.py makemigrations
和python manage.py migrations
-
生成的表名默认是app名_类名,会自动创建一个主键叫id的字段
二、使用mysql数据库
django 默认使用sqlite
数据库,当想使用mysql时,需要额外配置
-
在setting.py 配置如下
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'testuser',
'USER':'root',
'PASSWORD':'root',
'HOST':'localhost',
'PORT': '3306',
}
}
-
在project同名的配置的 init.py文件中
注明:由于Django内部连接MySQL时使用的是MySQLdb模块,而python3中还无此模块,所以需要使用pymysql来代替
import pymysql
pymysql.install_as_MySQLdb()
三、操作数据的增删改查
-
生成的表格式如下
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=20)
price = models.IntegerField()
pud_data = models.DateField()
author = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
-
增加用法
-
第一种用法save
- 注:Django 使用一种直观的方式把数据库表中的数据表示成Python 对象:一个模型类代表数据库中的一个表,一个模型类的实例代表这个数据库表中的一条特定的记录。
def index(request):
from cm import models
obj = models.Book(name="python",price=199,pud_data="2017-11-11",author="wang")
obj.save()
return HttpResponse('ok')
-
第二种create方法
def index(request):
from cm import models
dic = {
"name":"go", "price" : 19,
"pud_data" : "2016-11-11",
"author" : "ang"
}
obj = models.Book.objects.create(**dic)
obj.save()
return HttpResponse('ok')
-
查询的用法
-
简单all()/fittler()/exclude()/get()
- all返回一个QuerySet,里面包含着是每一行的对象
def index(request):
from cm import models
obj = models.Book.objects.all()
#打印内容<QuerySet [<Book: Book object>, <Book: Book object>]>
print(obj)
return HttpResponse('ok')
- fittler条件过滤使用,等同于sql中的where,返回的一个过滤后的QuerySet
def index(request):
from cm import models
obj = models.Book.objects.filter(name="python")
print(obj)
return HttpResponse('ok')
- exclude返回一个新的QuerySet,它包含不满足查询参数的对象
def index(request):
from cm import models
obj = models.Book.objects.filter(name="python")
print(obj)
return HttpResponse('ok')
- get只有一个对象满足你的查询,也就是查询必须且只有一个返回符合的查询语句
def index(request):
from cm import models
obj = models.Book.objects.get(name="python")
print(obj)
return HttpResponse('ok')
-
链式查询小技巧
>>> Entry.objects.filter(
... headline__startswith='What'
... ).exclude(
... pub_date__gte=datetime.date.today()
... ).filter(
... pub_date__gte=datetime(2005, 1, 30)
... )
这个例子最开始获取数据库中所有对象的一个[QuerySet
](,之后增加一个过滤器,然后又增加一个排除,再之后又是另外一个过滤器。 最后的结果仍然是一个[QuerySet
],它包含标题以”What“开头、发布日期在2005年1月30日至当天之间的所有记录。
-
更改的用法
-
update,先查在改,不能使用get方法,因为update是qureyset对象的方法,get是一model对象
def index(request):
from cm import models
obj = models.Book.objects.filter(price=199).update(name = "c")
print(obj)
return HttpResponse('ok')
-
删除
-
删除用delete
def index(request):
from cm import models
obj = models.Book.objects.filter(price=199).delete()
print(obj)
return HttpResponse('ok')
网友评论