在虚拟环境中安装mysql包html
pip install mysql-pythonpython
在mysql中建立数据库mysql
create databases test charset=utf8git
打开settings.py文件,修改DATABASES项sql
DATABASES = {
'default': {数据库'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': '用户名', 'PASSWORD': '密码', 'HOST': '数据库服务器ip,本地可使用localhost', 'PORT': '端口,默认为3306',复制代码
}
}django
对于重要数据都作逻辑删除,不作物理删除,实现方法是定义isDelete属性,类型为BooleanField,默认值为False缓存
TimeField:使用Python的datetime.time实例表示的时间,参数同DateFieldbash
mytestinfo.testinfo_set.all()服务器
用一访问一:对象.模型类小写
testinfo.mytestinfo
访问id:对象.属性_id
testinfo.mytest_id
元信息db_table:定义数据表名称,推荐使用小写字母,数据表的默认名称
<应用名称>_<模型类名称>
ordering:对象的默认排序字段,获取对象的列表时使用,接收属性构成的列表
class TestInfo(models.Model):
class Meta(): ordering = ['id']复制代码
字符串前加-表示倒序,不加-表示正序
class TestInfo(models.Model):
class Meta():ordering = ['-id']复制代码
支持明确指定模型类的管理器
class BookInfo(models.Model):
books = models.Manager()
当为模型类指定管理器后,django再也不为模型类生成名为objects的默认管理器
管理器是Django的模型进行数据库的查询操做的接口,Django应用的每一个模型都拥有至少一个管理器
自定义管理器类主要用于两种状况
向管理器类中添加额外的方法建立管理器对象保存数据到数据库
class TestInfoManager(models.Manager):
def create_test(self, title, update):
test = self.model()
test.isDelete = False
return testclass TestInfo(models.Model):
tests = TestInfoManager()
方法调用:book=TestInfo. tests.create_ test("abc",datetime(1980,1,1))
保存:test.save()
修改管理器返回的原始查询集:重写get_queryset()方法
class TestInfoManager(models.Manager):
def get_queryset(self):
return super(TestInfoManager, self).get_queryset().filter(isDelete=False)
class TestInfo(models.Model):
tests = TestInfoManager()
当建立对象时,django不会对数据库进行读写操做
在模型类中增长一个类方法保存数据到数据库
class BookInfo(models.Model):
@classmethod
def create(cls, title):test = cls(btitle=title) test.isDelete = False return test复制代码
引入时间包:from datetime import *
调用:test=TestInfo.create("hello");
保存:test.save()
DoesNotExist:在进行单个查询时,模型的对象不存在时会引起此异常,结合try/except使用
返回查询集的方法,称为过滤器,管理器对象方法有all()、filter()、exclude()、order_by()、values()
返回单个值的方法
模型查询集的缓存
这构成了两个查询集,没法重用缓存,每次查询都会与数据库进行一次交互,增长了数据库的负载
print([e.title for e in Entry.objects.all()])
print([e.title for e in Entry.objects.all()])
querylist=Entry.objects.all()
print([e.title for e in querylist])
print([e.title for e in querylist])
什么时候查询集不会被缓存:当只对查询集的部分进行求值时会检查缓存,可是若是这部分不在缓存中,那么接下来查询返回的记录将不会被缓存,这意味着使用索引来限制查询集将不会填充缓存,若是这部分数据已经被缓存,则直接使用缓存中的数据
比较运算符:表示两个下划线,左侧是属性名称,右侧是比较类型
exact:表示判等,大小写敏感;若是没有写“ 比较运算符”,表示判等
filter(isDelete=False)
contains:是否包含,大小写敏感
exclude(btitle__contains='传')
startswith、endswith:以value开头或结尾,大小写敏感
exclude(btitle__endswith='传')
isnull、isnotnull:是否为null
filter(btitle__isnull=False)
在前面加个i表示不区分大小写,如iexact、icontains、istarswith、iendswith
in:是否包含在范围内
filter(pk__in=[1, 2, 3, 4, 5])
gt、gte、lt、lte:大于、大于等于、小于、小于等于
filter(id__gt=3)
year、month、day、week_day、hour、minute、second:对日期间类型的属性进行运算
filter(bpub_dateyear=1980)
filter(bpub_dategt=date(1980, 12, 31))
跨关联关系的查询:处理join查询
语法:模型类名 <属性名> <比较>
注:能够没有<比较>部分,表示等于,结果同inner join
可返向使用,即在关联的两个模型中均可以使用
filter(heroinfohcontent__contains='八')
查询的快捷方式:pk,pk表示primary key,默认的主键是id
filter(pk__lt=6)
from django.db.models import Max
maxDate = list.aggregate(Max('bpub_date'))
count = list.count()
可使用模型的字段A与字段B进行比较,若是A写在了等号的左边,则B出如今等号的右边,须要经过F对象构造
list.filter(read__gte=F('commet'))
django支持对F()对象使用算数运算
list.filter(read__gte=F('commet') * 2)
F()对象中还能够写做“模型类__列名”进行关联查询
list.filter(isDelete=F('testinfo__isDelete'))
对于date/time字段,可与timedelta()进行运算
list.filter(update__lt=F('update') + timedelta(days=1))
Q对象(django.db.models.Q)用于封装一组关键字参数,这些关键字参数与“比较运算符”中的相同
from django.db.models import Q
list.filter(Q(pk_ _lt=6))
Q对象可使用&(and)、|(or)操做符组合起来
当操做符应用在两个Q对象时,会产生一个新的Q对象
list.filter(pk_ lt=6).filter(bcommet gt=10)
list.filter(Q(pk lt=6) | Q(bcommet _gt=10))
使用~(not)操做符在Q对象前表示取反
list.filter(~Q(pk__lt=6))
可使用&|~结合括号进行分组,构造作生意复杂的Q对象
class AreaInfo(models.Model): atitle = models.CharField(max_length=20) aParent = models.ForeignKey('self', null=True, blank=True)