A quick reference for django the test project is in rest-framework-test repository
FAQ
Databases and models
How can I see the raw SQL queries Django is running? 查看queryset的sql语句 使用connection.queries
DEBUG模式
from django.db import connection
connection.queires
from djabgo.db import reset_queries
reset_queries() # 清空query
或者使用print(queryset.query) queryset.query.sql_with_params() stackoverflow链接
Topic guides
讨论各种主题和工具 at a fairly high level, 提供一些背景知识和解释
Models and databases
Model & Queryset
Django The Model Layer 数据库model层 官网
Model & Field
Field Options
unique, blank, null的用法,歧义解释
Migrations
Introduction to Migrations
Data Migrations 数据迁移
python manage.py makemigrations --empty yourappname
from django.db import migrations
def combine_names(apps, schema_editor):
Person = apps.get_model("yourappname", "Person")
for person in Person.objects.all():
person.name = "%s %s" % (person.first_name, person.last_name)
person.save()
class Migration(migrations.Migration):
dependencies = [
("yourappname", "0001_initial"),
]
operations = [
migrations.RunPython(combine_names, reverse_code=migrations.RunPython.noop)
]
压缩迁移 Squashing migrations
TODO list
[ ] Model Instance
[ ] Other
views
url
Request and Response
Forms 表单
Form API
Using forms to validate data
attribute
errors 具体的报错信息
f.errors {'sender': ['Enter a valid email address.'], 'subject': ['This field is required.']}
method
clean()其实就是调用了clean_data
Built-in fields
FileField
开发进程 Development Process
Settings配置
-
Configuring applications
from django.apps import AppConfig class MyAppConfig(AppConfig): verbose_name = "自己的名字" 注意修改后要在 app/__init__.py 里面设置 default_app_config = 'app.apps.MyAppConfig'
Exceptions
Django Core Exceptions
from django.core.exceptions import *ValidationError()
ObjectDoesNotExist 因为model.DoesNotExist是继承了这个Exception, 所以可以用一个ObjectDoesNotExist来判断多个错误
from django.core.exceptions import ObjectDoesNotExist try: e = Entry.objects.get(id=3) b = Blog.objects.get(id=1) except ObjectDoesNotExist: print("Either the entry or blog doesn't exist.")
model.DoesNotExist
from django.core.exceptions import ObjectDoesNotExistMultipleObjectsReturned
PermissionDenied()
django-admin and manage.py
from django.core.management import call_command
Testing 测试
Deployment 部署
WSGI servers, uwsgi
gunicorn
信号的处理机制
signal绑定的情况下
如果是runserver的进程, term的时候会直接崩溃
如果是gunicorn的进程, term的时候也会直接崩溃
没有signal绑定的情况下
如果是gunicorn的进程, 会先启动新的进程, term的时候会等待最后一个请求完成
Security
Cross Site Request Forgery protection
form表单提交的csrf数据: csrfmiddlewaretoken="wfjdaefefewajfklajsf"
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def view(request):
return HttpResponse('csrf')
国际化本地化
Time zones 时区
Python Compatibility 23兼容
from django.utils.encoding import python_2_unicode_compatible
from __future__ import unicode_literals
常用的网站应用 Common Web application tools
Serialization
from django.core import serializers
serializers.serializer("json", Iterable[Model], indent=4) # json字符串
用户认证 权限
Authentication Permission
cache 缓存系统,
from django.core.cache import cache
from django.core.cache import caches
cache.set('foo', 'bar', timeout=3600)
cache = caches['thirdparty']
cache.set('foo', 'bar', timeout=3600*24*60)
cache.get('cache_list', []) # 没有默认值就返回None
Pagination
from django.core.pagiator import Paginator
objects = Model.objects.all()
p = Paginator(objects, 2) # 每页显示2个元素
p.count # 获取一共多少个元素
p.num_pages # 获取页数
objectslist = p.page(n) # 获取第n页
objectslist.has_previous | has_next # 判断是否有下一页
objectslist.previous_page_number | next_page_number # 获取上一页或下一页的页码
objectslist.number # 当前页码
Data Validation
Other core functionalities 其他功能
Content Types and Generic relations
The ContentType Model
app_label: application的名字.如果有层import,就是最后的路径
model: model的name
name: 人看的name
-
[ ]
model_class(): 返回contenttype对应的model
class ContentType(models.Model): def model_class(self): try: return apps.get_model(self.app_label, self.model) except LookupError: return None
ContentTypeManager
[ ]
get_for_model(model)
ContentType.objects.get_for_model(User)
[ ]
TODO list
[ ] Document
[ ] First Steps
utils
生成随即的字符串
from django.utils.crypto import get_random_string
get_random_string(length=6)