Django--20170905--笔记
Posted 学习是不让自己瞎想的最好方式
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django--20170905--笔记相关的知识,希望对你有一定的参考价值。
一、django的安装
1.先安装python
2.再安装django:pip install django
3.使用虚拟环境:pip install virtualenv
二、项目的创建
1.可以先创建一个虚拟目录
创建虚拟目录:
virtualenv --no-site-packages venv
进入虚拟目录:
source venv/bin/activate
2.创建一个工程:
创建:
django-admin startproject projectName
目录结构大致如下:
启动服务:
python manage.py runserver 0.0.0.0:8000
3.创建app:
进入projectName目录下运行:python manage.py startapp appName
目录结构大致如下:
4.创建模型:
1.编辑model.py文件:如添加如下代码
1 from django.db import models 2 from django.utils import timezone 3 import datetime 4 # Create your models here. 5 6 7 class Question(models.Model): 8 question_text = models.CharField(max_length=200) 9 pub_date = models.DateTimeField(\'date published\') 10 11 def __str__(self): # __unicode__ on Python 2 12 return self.question_text 13 14 def was_published_recently(self): 15 return self.pub_date >= timezone.now() - datetime.timedelta(days=1) 16 was_published_recently.admin_order_field = \'pub_date\' 17 was_published_recently.boolean = True 18 was_published_recently.short_description = \'Published recently?\' 19 20 21 class Choice(models.Model): 22 question = models.ForeignKey(Question) 23 choice_text = models.CharField(max_length=200) 24 votes = models.IntegerField(default=0) 25 26 def __str__(self): # __unicode__ on Python 2 27 return self.choice_text
注:类中相应的属性,对于数据库中表的相应列名
2.编辑setting.py文件:
1)修改数据库配置信息:(根据自己的数据库配置)
DATABASES = {
\'default\':{
\'ENGINE\':\'django.db.backends.mysql\',
\'NAME\':\'pythontest\',
\'USER\':\'root\',
\'PASSWORD\':\'root\',
\'HOST\':\'localhost\',
\'PORT\':\'3306\',
}
}
2)修改INSTALLED_APPS,添加app:
INSTALLED_APPS = [
\'django.contrib.admin\',
\'django.contrib.auth\',
\'django.contrib.contenttypes\',
\'django.contrib.sessions\',
\'django.contrib.messages\',
\'django.contrib.staticfiles\',
\'appName\',
]
3.同步数据库:(项目根目录下执行)
python manage.py makemigrations polls
python manage.py migrate
------------------------------------------------------------------------------------------------
一.操作数据库
1.创建对象--save()
obejct = Object(name1=\'value1\', name2=\'value2\')
object.save()
others:
object = Object.objects.create(name1=\'value1\', name2=\'value2\')
2.保存对象的改动
object.name1 = \'change value\'
object.save()
更新ForeignKey 字段的方式和保存普通字段相同
更新ManyToManyField 的方式有一些不同 —— 需要使用字段的add()方法来增加关联关系的一条记录。
3.获取对象:通过模型的管理器构造一个查询集,来从数据库中获取对象
管理器只可以通过模型的类访问,而不可以通过模型的实例访问
获取所有对象:all_object = Object.objects.all()
过滤条件:filter(**kwargs)、exclude(**kwargs)
filter(**kwargs):包含满足查询参数的对象
exclude(**kwargs):包含不满足查询参数的对象
链式过滤:Object.objects.filter(...).exclude(...).filter(......)
查询集是惰性执行的:创建查询集不会带来任何数据库的访问。你可以将过滤器保持一整天,直到查询集 需要求值时,Django 才会真正运行这个查询。
获取单一的对象:Object.objects.get(pk=1) !!!不是返回查询集,如果对象不存在或有多条将报错
4.annotate(*args, **kwargs)
5.order_by()用来排序:默认情况下,QuerySet 根据模型Meta 类的ordering 选项排序
Object.objects.filter(pud_date__year=2017).order_by(\'-pub_date\',\'headline\'):根据pub_date降序,headline升序排序
每个order_by() 都将清除前面的任何排序。
6.reverse()
reverse() 方法反向排序QuerySet 中返回的元素
7.distinct([*fields])
返回一个在SQL 查询中使用SELECT DISTINCT的新QuerySet。它将去除查询结果中重复的行。
对于正常的distinct()调用,数据库在确定哪些行不同时比较每行中的每个字段。对于具有指定字段名称的distinct()调用,数据库将仅比较指定的字段名称。
8.values(*fields)
返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象。
Object.objects.values(\'id\',\'name\')
9.values_list(*fields,flat=False)
在迭代时返回的是元组而不是字典
10.dates(field,kind,order=\'ASC\')
返回DateQuerySet - QuerySet,其计算结果为datetime.date对象列表,表示特定种类的所有可用日期QuerySet。field应为模型的DateField的名称。 kind应为"year"、"month"或"day"。隐式的是升序排序
11.datetimes(field_name,kind,order=\'ASC\',tzinfo=None)
返回QuerySet,其计算为datetime.datetime对象的列表,表示QuerySet内容中特定种类的所有可用日期.
field_name应为模型的DateTimeField的名称。
kind应为“year”,“month”,“day”,“hour”,“minute”或“second”。
12.extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
13.defer(*fields)
在一些复杂的数据建模情况下,您的模型可能包含大量字段,其中一些可能包含大量数据(例如,文本字段),或者需要昂贵的处理来将它们转换为Python对象。如果您在某些情况下使用查询集的结果,当您最初获取数据时不知道是否需要这些特定字段,可以告诉Django不要从数据库中检索它们。
具有延迟字段的查询集仍将返回模型实例
14.only(*fields)
only()方法或多或少与defer()相反
15.using(alias)
如果你使用多个数据库,这个方法用于控制QuerySet 将在哪个数据库上求值。这个方法的唯一参数是数据库的别名,定义在DATABASES。
16.select_for_update(nowait=False)
返回一个 queryset ,会锁定相关行直到事务结束。在支持的数据库上面产生一个SELECT ...FORUPDATE语句
17.raw(raw_query, params=None, translations=None)
接收一个原始的SQL 查询,执行它并返回一个django.db.models.query.RawQuerySet 实例。这个RawQuerySet 实例可以迭代以提供实例对象,就像普通的QuerySet 一样。
18.使用Q 对象进行复杂的查询
可以组合& 和| 操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询:
Q(question__startswith=\'Who\') | ~Q(pub_date__year=2005)
Poll.objects.get(
Q(question__startswith=\'Who\'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
翻译sql:
SELECT * from polls WHERE question LIKE \'Who%\' AND (pub_date = \'2005-05-02\' OR pub_date = \'2005-05-06\')
19.为了比较两个模型实例,只需要使用标准的Python 比较操作符,即双等于符号:==。在后台,它会比较两个模型主键的值。
20.删除方法,为了方便,就取名为delete()。这个方法将立即删除对象且没有返回值。
Entry.objects.filter(pub_date__year=2005).delete()
21.拷贝模型实例
最简单的方法是,只需要将pk 设置为None。利用我们的Blog 示例:
blog = Blog(name=\'My blog\', tagline=\'Blogging is easy\')
blog.save() # blog.pk == 1
blog.pk = None
blog.save() # blog.pk == 2
---------------------------------------------------------------------------------------------
二、聚合
1.一般的聚合查询方法:
Object.objects.count()
Object.objects.all().aggregate(Avg(\'price\'))
Object.objects.all().aggregate(Max(\'price\'))
Object.objetcs.annotate(num_books=Count(\'book\')).order_by(\'num_books\')[:5]
aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。
逐个对象的汇总结果可以由annotate()子句生成。当annotate()子句被指定之后,QuerySet中的每个对象都会被注上特定的值。
annotate()子句的返回结果是一个查询集 (QuerySet)
order_by()用来排序
Object.objects.all().order_by(\'name1\')
values()分组
Object.objects.values(\'name\').annotate(average_rating=Avg(\'book__rating\'))
根据定义在values() 子句中的字段组合先对结果进行唯一的分组,再根据每个分组算出注解值, 这个注解值是根据分组中所有的成员计算而得的
以上是关于Django--20170905--笔记的主要内容,如果未能解决你的问题,请参考以下文章
[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段
sh bash片段 - 这些片段大多只是我自己的笔记;我找到了一些,有些我已经找到了