django常用组件学习3——DRF

标签:django, drf

DRF就是Django REST framework,官网是http://www.django-rest-framework.org/,我正在使用它来实现我们的移动APP数据接口,感觉非常的爽。 下面是对使用中出现的问题进行一些记录。

  • 用户模型 在django1.6及以上版本,默认使用django.contrib.auth.models.User进行签权。如果需要使用自定义的用户模型,需要扩展 AbstractUser类,并且在settings.py里进行设置:
    # settings.py
    AUTH_USER_MODEL = "myapp.NewUser"
  

自定义的User Model有三种方法 1)扩展 AbstractUser类 2)扩展 AbstractBaseUser类 3)使用OneToOneField。

  • 登录认证 DRF支持多种签权方式,需要在settings.py里进行设置:
    # settings.py
    REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
         'rest_framework.authentication.SessionAuthentication',
         'rest_framework.authentication.BasicAuthentication',       
         'rest_framework_jwt.authentication.JSONWebTokenAuthentication'
    )
  }
  

我们项目采用的是JWT的签权方式,所以还可以对JWT_AUTH的参数进行特别设置:

    # settings.py
    JWT_AUTH = {
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7),
    'JWT_RESPONSE_PAYLOAD_HANDLER': 'myapp.utils.response_payload_handler',
  }
  

默认的JWT_RESPONSE_PAYLOAD_HANDLER方法是“rest_framework_jwt.utils.jwt_response_payload_handler”,因为默认只返回一个”token”字符串,我们还需要返回用户的其他信息(比如用户ID),所以我们要自己一个response_payload_handler方法

  def response_payload_handler(token, user=None, request=None):
     return {
            'token': token,
            'user_id': user.id
        }
  
  • 对列表和详情数据使用不用的序列化类 使用drf-extensions
    from django.contrib.auth.models import User
    from myapps.serializers import UserSerializer, UserDetailSerializer
    from rest_framework_extensions.mixins import DetailSerializerMixin

    class UserViewSet(DetailSerializerMixin, viewsets.ReadOnlyModelViewSet):
        serializer_class = UserSerializer
        serializer_detail_class = UserDetailSerializer
    queryset = User.objects.all()
    
  • 对不同的操作使用不同的序列化类也可以这样写:
    class DualSerializerViewSet(viewsets.ModelViewSet):
    def get_serializer_class(self):
        if self.action == 'list':
            return serializers.ListaGruppi
        if self.action == 'retrieve':
            return serializers.DettaglioGruppi
        return serializers.Default # I dont' know what you want for create/destroy/update.
    
  • 关系表的序列化 这个按官方文档就可以了,最重要的是模型里不要忘记写“related_name”
    class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

    class Track(models.Model):
        album = models.ForeignKey(Album, related_name='tracks')
        order = models.IntegerField()
        title = models.CharField(max_length=100)
        duration = models.IntegerField()

        class Meta:
            unique_together = ('album', 'order')
            ordering = ['order']

        def __unicode__(self):
            return '%d: %s' % (self.order, self.title)
   
   class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ('order', 'title', 'duration')

    class AlbumSerializer(serializers.ModelSerializer):
        tracks = TrackSerializer(many=True, read_only=True)

        class Meta:
            model = Album
            fields = ('album_name', 'artist', 'tracks')
   
Written on 2015-12-24
上篇: django mysql存储emoji表情的问题
下篇: centos下安装MySQL-python