也许会有hui 2016-09-11
创建学生类
vim app0904/models.py from __future__ import unicode_literals from django.db import models # Create your models here. class Student(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=50) age=models.IntegerField() sex=models.IntegerField() class Meta: db_table='student'
同步数据库
[root@localhost project0904]# python manage.py makemigrations Migrations for 'app0904': app0904/migrations/0001_initial.py: - Create model Student [root@localhost project0904]# python manage.py migrate Operations to perform: Apply all migrations: admin, app0904, auth, contenttypes, sessions Running migrations: Applying app0904.0001_initial... OK
插入几个测试的Student
[root@localhost project0904]# python manage.py shell Python 2.7.5 (default, Jun 17 2014, 18:11:42) [GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2 Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> >>> >>> >>> from app0904.models import Student >>> Student.objects.create(id=1,name='zhangsan',age=11,sex=0) <Student: Student object> >>> Student.objects.all() <QuerySet [<Student: Student object>]> >>> Student.objects.all().get(id=1) <Student: Student object> >>> Student.objects.all()[0].id 1 >>> Student.objects.all()[0].name u'zhangsan' >>> >>> >>> Student.objects.create(id=2,name='lisi',age=12,sex=0) <Student: Student object>
创建测试模版
from django.shortcuts import render from app0904.models import Student def student_list(request): #studentList=Student.objects.all()#所有学生 #studentList=Student.objects.order_by('-age','id')#年龄倒序 id排序 studentList=Student.objects.filter(age__gte=11)#年龄大于11 return render(request,'student_list.html', {'studentList':studentList})
修改URLs.py
[root@localhost project0904]# vim project0904/urls.py from django.conf.urls import url from django.contrib import admin from app0904 import views urlpatterns=[ url(r'^$',views.main), url(r'^admin/',admin.site.urls), url(r'^studentlist/$',views.student_list), url(r'^hello/$',views.hello), url(r'^hellop1/(.+)/$',views.helloParam), url(r'^hello/(.+)/(.+)/$',views.helloParams), url(r'^hellopp/',views.helloPar)]
创建html文件
[root@localhost templates]# pwd /root/project0904/app0904/templates [root@localhost templates]# vim student_list.html {% extends 'base.html' %} {% block title%}studentlist{%endblock%} {% block content%} {%for student in studentList%} <li>{{student.id}},{{student.name}},{{student.age}},{{student.sex}}</li> {%empty%} sorry {% endfor %} {% endblock %}
1.多表连接查询:感觉django太NX了。
class A(models.Model):
name = models.CharField(u'名称')
class B(models.Model):
aa = models.ForeignKey(A)
B.objects.filter(aa__name__contains='searchtitle')
1.5 反向查询,补上记录1.5,感觉django太太太NX了。
class A(models.Model):
name = models.CharField(u'名称')
class B(models.Model):
aa = models.ForeignKey(A,related_name="FAN")
bb = models.CharField(u'名称')
查A: A.objects.filter(FAN__bb='XXXX'),都知道related_name的作用,A.FAN.all()是一组以A为外键的B实例,可前面这样的用法是查询出所有(B.aa=A且B.bb=XXXX)的A实例,然后还可以通过__各种关系查找,很好用!!!
2.条件选取querySet的时候,filter表示=,exclude表示!=。
querySet.distinct() 去重复
__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__startswith 以...开头
__istartswith 以...开头 忽略大小写
__endswith 以...结尾
__iendswith 以...结尾,忽略大小写
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
例子:
>> q1 = Entry.objects.filter(headline__startswith="What")
>> q2 = q1.exclude(pub_date__gte=datetime.date.today())
>> q3 = q1.filter(pub_date__gte=datetime.date.today())
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
即q1.filter(pub_date__gte=datetime.date.today())表示为时间>=now,q1.exclude(pub_date__gte=datetime.date.today())表示为<=now
2013/12/12补充:
“在django models中取得一个字段的distinct值”。就是select distinct xxx from table_name ...这样的功能。使用values会生成ValuesQuerySet(形如N个dict组成的list),猜测大数据无额外性能影响,毕竟queryset系列都是使用时才查询操作的。
xxxx.objects.values("field_name").distinct()
#或者
xxxx.objects.distinct().values("field_name")
这两句生成的sql语句相同
关于缓存:
queryset是有缓存的,a = A.objects.all(),print [i for i in a].第一次执行打印会查询数据库,然后结果会被保存在queryset内置的cache中,再执行print的时候就会取自缓存。
很多时候会遇到仅需判断queryset是否为空的情况,可以1. if queryset:pass 2.if queryset.count>0:pass 3.if queryset.exists():pass. 三种方式性能依次提升。
当queryset非常巨大时,cache会成为问题。此时可以queryset.iterator(),迭代器的用处就不多说了,根据具体需求情况使用。
增
myclass.objects.filter(aa='123') .order_by("‐aa")