REST的环境
virtualenv envsource env/bin/activate
在虚拟环境下:
pip install django
pip install djangorestframework
pip install pygments # 代码高亮
Serializer序列化
ModelSerializer
models.py同目录下建立serializer.py
并且对应于models.py
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'language', 'style') // 对应于model中的字段```
用户POST且没有CSRF token时需要:
@csrf_exempt
*最终目的:用于将model中的instances进行序列化并输出即*:
my_msg_list = ModelMsgList.objects.filter(user_id=user_id) // 取出model中的instances
msglist = MsgListSerializer(my_msg_list, many=True) //将instances进行序列化
msglist.data //取出序列化后的数据
Response(msglist.data) //返回数据
### Serializer Fields
`source`字段
URLField(source='get_absolute_url')
`format`字段
serializers.CharField(format="%Y-%m-%d %H:%M:%S.%f")
`allow_null`字段
serializers.CharField(allow_null=True)
`default`字段
serializers.CharField(default='')
`label`字段
serializers.CharField(label='ID')
`required`字段
`queryset`字段
serializers.PrimaryKeyRelatedFieldqueryset=User.object.all()
`read_only`字段
serializers.IntegerField(read_only=True)
### Serializer relations
调用方法:
from rest_framework import serializers
serializer.<Fieldname>
列出一些常见的序列化关系:
- `ForeignKey`外键关系
- `ManyToManyField`多对多关系
- `OneToOneField`一对一关系:用于扩展表属性
- `PrimaryKeyRelatedField`主键关系
class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.HyperlinkedRelatedField(many=True,read_only=True, view_name='track-detail')
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')
将序列化成:
{
'album_name': 'Graceland',
'artist': 'Paul Simon',
'tracks': [ // 列表[]需要many = true; URL需view_name=<modelname>-detail
'http://www.example.com/api/tracks/45/',
'http://www.example.com/api/tracks/46/',
'http://www.example.com/api/tracks/47/',
...
]
}
## Request请求
### 请求解析
request.data // POST,PU,DELETE方法,可返回文件
request.query_params // GET方法
request.parsers
### 内容协商:根据不同的媒体类型进行不同的serilization
request.renderer
request.accepted_media_type
### Authentication认证
request.user通常返回`django.contrib.auth.models.User`的一个实例,虽然该行为取决于所使用的认证策略。
request.user
`request.auth`返回任何附加的身份验证上下文。 `request.auth`的确切行为取决于所使用的认证策略,但它通常可以是请求被认证的令牌的实例。 如果请求未认证,或者没有其他上下文,则`request.auth`的默认值为`None`
request.auth
request.authenticators
### enhancements
request.method //返回HTTP method名,大写
### 标准HTTP Response属性
request.META // HTTP Header
request.session // SESSION
## Response
Response(data, status=None, template_name=None, headers=None, content_type=None)
render // 渲染器
data // 要返回的数据内容
frome rest_framework import status
status.HTTP_404_NOT_FOUND
(关于status code )[http://www.django-rest-framework.org/api-guide/status-codes/]
## View视图
from rest_framework.views import APIView
class ListUsers(APIView):
""" View to list all users in the system.
- Requires token authentication.
- Only admin users are able to access this view.
"""
authentication_classes = (authentication.TokenAuthentication,) //需要token认证
permission_classes = (permissions.IsAdminUser,) // 仅仅管理者用户能接入这个view
## Returning URLs
一般情况下,返回一个URI绝对的绝对路径比相对路径更好,例如`http://example.com/foobar`比`/foobar`好REST框架提供两个工具函数帮助Web API返回URI的绝对路径
reverse(viewname, *args, **kwargs)
reverse_lazy(viewname, *args, **kwargs)