django知识点总结

一、django创建项目

CMD 终端:Django_admin startproject sitename(文件名)
通过类创建表   python manage.py makemigrations
                    python manage.py migrate
其他命令:
python manage.py runserver 0.0.0.0
python manage.py stratapp appname     # 创建APP
python manage.py suncdb
python manage.py createsuperuser         # 创建超级用户

二、创建数据库(ORM)

1. 数据库表的增

增:
在原来models.py文件中添加一个新的类(ORM---类就是表,对象是行)
在Terminal执行:--python manage.py makemigrations 
                       --python manage.py migrate 命令更新数据库                        
# 这是原来的表
class UserINfo(models.Model):
     nickname = models.CharField(max_length=32)
     username = models.CharField(max_length=32)
     password = models.CharField(max_length=32)
     gender_list=(
         (1,''),
         (2,''),
     )
     gender = models.IntegerField(choices=gender_list)
     m = models.ManyToManyField('UserINfo')
#-------------------------------------------------------------------------
# 这是新增的表
class User(models.Model):
     new_id=models.IntegerField(null=True)
     new_tabe= models.CharField(max_length=32)
     new_content =models.CharField(max_length=64)
     new_root = models.CharField(max_length=32)
     content = models.ForeignKey('User',null=True,blank=True,related_name='xxx')
增 示例

2. 数据库表的删

删:
在原来创建表的py文件中把不要的表对应的类注释掉(ORM---类就是表,对象是行)
在Terminal执行:--python manage.py makemigrations
               --python manage.py migrate  命令更新数据库
#这是数据库的表
class GTB(models.Model):
     g = models.ForeignKey('Boy',null=True)
     b = models.ForeignKey('Grily',null=True)
 
# -------------------------------------------------------------
#这是删除数据库表
# class UserInfo(models.Model):
#     nickname = models.CharField(max_length=32)
#     username = models.CharField(max_length=32)
#     password = models.CharField(max_length=32)
#     gender_list=(
#         (1,'男'),
#         (2,'女'),
#     )
#     gender = models.IntegerField(choices=gender_list)
删 示例

3. 数据库表的改

改:
在原来创建表的py文件中把要进行的表对应的类进行调整(ORM---类就是表,对象是行)

在Terminal执行:--python manage.py makemigrations 
        --python manage.py migrate 命令更新数据库
#这是数据库未进行修改的表
class Boy(models.Model):
     username = models.CharField(max_length=32)
     nickname = models.CharField(max_length=32)
     password = models.CharField(max_length=32)
 

#------------------------------------------------------------
#这是要进行更改数据的表
class Boy(models.Model):
     username = models.CharField(max_length=32)
     name = models.CharField(max_length=32)
     password = models.CharField(max_length=32)
改 示例

4. 数据库表中行的增

创建一个url对应的函数,通过浏览器访问这个url触发相对应的函数
在函数中设置数据库行的增加命令
在对表的行进行增加时,参数是创建表时的每列名称以及对应的参数值
models.Body.objects.create(username='波多爱军',password=123,sex=1)
def index(request):
    models.Body.objects.create(username='张三',password=123,sex=1)
    models.Body.objects.create(username='李四',password=123,sex=1)
    models.Body.objects.create(username='王五',password=123,sex=1)
    models.Body.objects.create(username='赵六',password=123,sex=1)
行增加 示例

5. 数据库表中行的删 

创建一个url对应的函数,通过浏览器访问这个url触发相对应的函数
在函数中设置数据库行的删除命令
在对表的行进行增加时,参数是创建表时的每列名称以及对应的参数值
models.Body.objects.delete(username='lucy'
def index(request):
    models.Body.objects.delete(username='波多爱军',password=123,sex=1)
行删除 示例

6.  数据库表中行的改

创建一个url对应的函数,通过浏览器访问这个url触发相对应的函数
在函数中设置数据库行的修改命令
在对表的行进行增加时,参数是创建表时的每列名称以及对应的参数值
models.Body.objects.filter(username='lucy').update(username='张三')
def index(request):
    models.Body.objects.filter(username='张三',password=123,sex=1).update(username='张三',password=233,sex=2)
行修改 示例

7. 数据库表中行的查

models.Body.objects.filter(username='lucy').all()
def gets(request):
#     models.UserInfo.objects.all()
#     # 查看全部行的数据
 
#     models.UserInfo.objects.filter(id=2)
#     #查看id等于2的哪行数据

#     models.UserInfo.objects.first()
#     #查看第一个数据

#     models.UserInfo.objects.last()
#     #查看最后一个数据

#     models.UserInfo.objects.exclude(id=4)
#     #查看id不等于4的所有内容

#     models.UserInfo.objects.filter(name='lisi').count()
#     #获取名字等于lisi的总数

#     models.UserInfo.objects.get(name='lisi')
#     #获取名字等于lisi的单个对象
 
#     models.UserInfo.objects.filter(id_gt=1)
#     #查看id大于1的行内容

#     models.UserInfo.objects.filter(id_lt=2)
#     #查看id小于2的行内容

#     models.UserInfo.objects.filter(id_gte=1)
#     #查看id大于等于1的行内容
 
#     models.UserInfo.objects.filter(id_let=5)
#     #查看id小于等于5的行内容
 
#     models.UserInfo.objects.filter(id_lt=10,id_gt=1)
#     #查看id大于1且id小于10的行内容

#     models.UserInfo.objects.filter(id__in=[11,33,44])
#     #查看id在不在列表中
 
#     models.UserInfo.objects.exclude(id_in=[11,33,44])
#     #查看id不在列表中的的数据内容
 
#     models.UserInfo.objects.filter(pud_date__isnull=True)
#     #查看pud_date不是为空

#     models.UserInfo.objects.filter(name__contains='lisi')
#     #查看名字中列中包含lisi的数据内容

#     models.UserInfo.objects.exclude(name__icontains='lisi')
#     #查看名字中列中包含lisi(大小写不敏感)的数据内容
 
#     models.UserInfo.objects.filter(ut_id__range=[1,5])
#     #范围(bettwen  end)

#     models.UserInfo.objects.filter(name__startswith='lisi')
#     #查看名字以lisi开头的数据行

#     models.UserInfo.objects.filter(name__istartswith='lisi')
#     #查看名字以lisi开头(大小写不敏感)的数据行
 
#     models.UserInfo.objects.filter(name__endswith='lisi')
#     #查看名字以lisi结尾的数据行
 
#     models.UserInfo.objects.filter(name__iendswith='lisi')
#     #查看名字以lisi(大小写不敏感)的数据行
 
#     models.UserInfo.objects.all().order_by('-id')
#     #以降序进行排列查看
 
#     models.UserInfo.objects.all().order_by('id')
#     #以升序进行排列查看(默认使用升序)   
 
#     models.UserInfo.objects.all()[1:4]
#     #分页limit offset 起始位置和结束位置
行查看 示例

 三、路由系统

1、单一路由对应

url(r'^index$', views.index),

2、基于正则的路由

url(r'^index/(\d*)', views.index),
url(r'^manage/(?P<name>\w*)/(?P<id>\d*)', views.manage),

3、添加额外的参数

url(r'^manage/(?P<name>\w*)', views.manage,{'id':333}),

4、为路由映射设置名称

url(r'^home', views.home, name='h1'),
url(r'^index/(\d*)', views.index, name='h2'),
设置名称之后,可以在不同的地方调用,如:

模板中使用生成URL     {% url 'h2' 2012 %}
函数中使用生成URL     reverse('h2', args=(2012,))      路径:django.urls.reverse
Model中使用获取URL  自定义get_absolute_url() 方法
class NewType(models.Model):
     caption = models.CharField(max_length=16)
 

    def get_absolute_url(self):
         """
         为每个对象生成一个URL
        应用:在对象列表中生成查看详细的URL,使用此方法即可!!!
         :return:
         """
         # return '/%s/%s' % (self._meta.db_table, self.id)
         #
         from django.urls import reverse
         return reverse('NewType.Detail', kwargs={'nid': self.id})
View Code

获取请求匹配成功的URL信息:request.resolver_match

5、根据app对路由规则进行分类

url(r'^web/',include('web.urls')),

6、命名空间

a. project.urls.py

from django.conf.urls import url,include
 
urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author-polls')),
    url(r'^b/', include('app01.urls', namespace='publisher-polls')),
]

b. app01.urls.py

from django.conf.urls import url
from app01 import views
 
app_name = 'app01'
urlpatterns = [
    url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

c. app01.views.py

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)
以上定义带命名空间的url之后,使用name生成URL时候,应该如下:

v = reverse('app01:detail', kwargs={'pk':11})
{% url 'app01:detail' pk=12 pp=99 %}
django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。

四、模板

1、模板的执行

模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)
from django import template
t = template.Template('My name is {{ name }}.')
c = template.Context({'name': 'Adrian'})
print t.render(c)
import datetime
from django import template
import DjangoDemo.settings

now = datetime.datetime.now()
fp = open(settings.BASE_DIR+'/templates/Home/Index.html')
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date': now}))
return HttpResponse(html)
from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime
 
def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Context({'current_date': now}))
    return HttpResponse(html)
return render_to_response('Account/Login.html',data,context_instance=RequestContext(request))

2、模板语言

模板中也有自己的语言,该语言可以实现数据展示

{{ item }}

{% for item in item_list %}  <a>{{ item }}</a>  {% endfor %}
  forloop.counter
  forloop.first
  forloop.last 

{% if ordered_warranty %}  {% else %} {% endif %}

母板:{% block title %}{% endblock %}
子板:{% extends "base.html" %}
   {% block title %}{% endblock %}

帮助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}

3、自定义simple_tag

a、在app中创建templatetags模块

b、创建任意 .py 文件,如:xx.py

#!/usr/bin/env python
#coding:utf-8
from django import template
from django.utils.safestring import mark_safe
    
register = template.Library()
    
@register.simple_tag
def my_simple_time(v1,v2,v3):
    return  v1 + v2 + v3
    
@register.simple_tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名

{% load xx %}

d、使用simple_tag

{% my_simple_time 1 2 3%}
{% my_input 'id_username' 'hide'%}

e、在settings中配置当前app,不然django无法找到自定义的simple_tag

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
)
View Code

五、F

from django.db.models import F

models.UserInfo.objects.all().update(age=F('age')+1)

六、Q

====Q用于构造复杂查询条件====
# Q(nid__gt=10)
# #创建一个Q
# Q(nid=8) | Q(nid__gt=10)
# #俩个Q是或的关系
# Q(nid=8) & Q(nid__gt=10)
# #俩个Q是与的关系
# Q(nid=8) | Q(nid__gt=10) & Q(nid=7)
# #Q8 和 Q7 或 Q10 和 Q7的关系
#方法一:
# Q(nid__gt=10)
# #创建一个Q
# Q(nid=8) | Q(nid__gt=10)
# #俩个Q是或的关系
# Q(nid=8) & Q(nid__gt=10)
# #俩个Q是与的关系
# Q(nid=8) | Q(nid__gt=10) & Q(nid=7)
# #Q8 和 Q7 或 Q10 和 Q7的关系
 
#方法二:
# from django.db.models import Q
# q1=Q()
# q1.connector='OR'
# q1.children.append(('id_gt',1))
# q1.children.append(('id',10))
# q1.children.append(('id',9))

# q2=Q()
# q2.connector='OR'
# q2.children.append(('c1',2))
# q2.children.append(('c1',10))
# q2.children.append(('c1',9))

# q3=Q()
# q3.connector='AND'
# q3.children.append(('id',1))
# q3.children.append(('id',2))
# q2.add(q3,'OR')

# con=Q()
# con.add(q1,'AND')
# con.add(q2,'AND')

# models.UserInfo.objects.filter(con)
Q演示

七、extra

======================extra是一种扩展方式========================
models.UserInfo.objects.extra(where=['headline=%s'],params=[1,])<br><br>
def extra(self,select=None,where=None,params=None,tables=None,order_by=None,select_params=None)
    where ---------params
    select ----------select_params
# def gets(request):
#     models.UserInfo.objects.extra(where=['headline=%s'],params=[1,])
#     #where 和 params 配合使用
#     models.UserInfo.objects.extra(where=["foo='a' OR bar='a',baz='a"])
#     #查询条件是foo和baz等于a   或者bar和baz等a
 #     models.UserInfo.objects.extra(select={'new_id':"select id from tb where id>%s"},select_params=(1,),order_by=['-nid'])
#     #查询id大于1并以降序排列
extra 演示

八、连表

1、对象连表

# models.UserInfo.objects.all()
#查看UserIinfo表的所有行
# models.UserInfo.objects.filter(id=2)
##查看UserInfo表id等于2的哪一行内容
# result = models.UserInfo.objects.all()
##通过此方式返回一个列表中存放的是对象(object)
# for row in result:
#     print(row.name,row.id,row.age,row.ut.title)
##以是对象的方式进行连表

2、字典连表

# models.UserInfo.objects.all()
## 查看表的所有行
# models.UserInfo.objects.filter(id=1)
##查看表的id是1的行
# result=models.UserInfo.objects.all().values('id','name','ut__title')
##通过此方式连表返回个列表,列表中存放的是字典对象(dict)
# for row in result:
#     print(row)

3、元组连表

# models.UserInfo.objects.all()
## 查看表的所有行
# models.UserInfo.objects.filter(id=2)
##查看表的id是2的行
# result=models.UserInfo.objects.all().values_list('id','name','ut__title')
##通过此方式连表返回个列表,列表中存放的是元组对象(tuple)
# for row in result:
#     print(row)

 九、正反向查找

result = models.UserInfo.objects.all()
    for obj in result:
          print(obj.name,obj.age,obj.ut_id,obj.ut.title)
        #打印obj对象的名字,对象的年龄,对象的外键,ut设置外键的列就是相当于ut表对应的主键(现在拿到就是ut那个表可以拿ut对应的一行所有内容)
     result = models.UserInfo.objects.all().first()
      ##获取表中所有的行但只是拿第一个对象,也就是第一行
      print(result.name,result.age,result.ut)
对象正向查找
# obj = models.UserType.objects.all().last()
# print('用户类型',obj)
# for row in obj.userinfo_set.all():
#     print(row.name,row.age)
对象反向查找
# models.UserInfo.objects.filter(id__gt=7).delete()
#v=models.UserInfo.objects.all().values('name','age','ut__title')
# print(v)
字典正向查找
# vv = models.UserType.objects.values('title','userinfo__name')
# print(vv)
字典反向查找
# v3 = models.UserInfo.objects.all().values_list('name','age','ut__title')
# print(v3)
元组正向查找
# v4 = models.UserType.objects.all().values_list('title','userinfo__name')
# print(v4)
元组反向查找

十、排序

# user_list = models.UserInfo.objects.all().order_by('-id')
# ##排序默认的升序,order_by('-id')是降序
# for i in user_list:
#     print(i.name,i.id)
# return HttpResponse('....')
ss =models.UserInfo.objects.all().order_by('-id','age').reverse()
print(ss.query)
'''
 SELECT "appo1_userinfo"."id", "appo1_userinfo"."name", "appo1_userinfo"."age", "appo1_userinfo"."ut_id" FROM "appo1_userinfo" ORDER BY "appo1_userinfo"."id" ASC, "appo1_userinfo"."age" DESC
 
'''

# 将设置的排序方式进行反转,本来id是降序,age是升序,反转后id 是升序,age是降序
排序 演示

十一、annotate(组合)

def annotate(self,*args,**kwargs):
    #用于实现聚合group by查询
    from django.db.models import Count,Avg,Max,Min,Sum
     v = models.UserInfo.objects.values('ut_id').annotate(wsa=Count('ut_id'))
    print(v.query)
'''
SELECT "appo1_userinfo"."ut_id", COUNT("appo1_userinfo"."ut_id") AS "uid" FROM "appo1_userinfo" GROUP BY "appo1_userinfo"."ut_id"
 
 '''

十二、转化成sql语句

v = models.UserInfo.objects.values('ut_id').annotate(wws=Count('ut_id')).filter(ut_id__gt=2)
 print(v.query)
<br>SELECT "appo1_userinfo"."ut_id", COUNT("appo1_userinfo"."ut_id") AS "wws" FROM "appo1_userinfo" WHERE "appo1_userinfo"."ut_id" > 2 GROUP BY "appo1_userinfo"."ut_id"

十三、去重

v= models.UserInfo.objects.values('ut_id').distinct()
#进行去重
 print(v.query)
 
 '''
SELECT DISTINCT "appo1_userinfo"."ut_id" FROM "appo1_userinfo"
 '''
 
#注:只有在PostgresSQL中才能使用distinct进行去重
#如果是PostgresSQL
# models.UserInfo.objects.distinct('nid')

十四、排除某列数据

# ss=models.UserInfo.objects.defer('age','ut_id')
# #映射中排除某列数据
# for i in ss:
#     print(i.id)

十五、仅获取某列数据

# sss=models.UserInfo.objects.all().only('age')
#仅取某列数据
# for i in sss:
#     print(i.age)

 

 

猜你喜欢

转载自www.cnblogs.com/huangjm263/p/8946755.html