1. 程式人生 > >Django REST Framework學習-分頁,通用檢視,自定義RelatedField

Django REST Framework學習-分頁,通用檢視,自定義RelatedField

使用通用檢視+分頁+自定義RelatedField

url:cardusers/pk/

傳入模型Card的pk,獲取當前Card的所有User中username和頭像avatar,User是avatar的外來鍵

1. 過載ListAPIView,加入分頁

class UserSnapList(ListAPIView):


    paginate_by = 10
    paginate_by_param = 'page_c'
    serializer_class = UserSnapshoot
    model = User


    def get_object(self, pk):
        try:
            return Card.objects.get(pk=pk)
        except Card.DoesNotExist:
            raise Http404




    def get(self, request, *args, **kwargs):
        card = self.get_object(pk = kwargs.get('pk'))
        self.queryset = card.users.all()
        return super(UserSnapList, self).get(request, *args, **kwargs)

2. 自定義RelatedField

from django.contrib.auth import get_user_model

from avatar.models import Avatar
from avatar.util import get_default_avatar_url

from rest_framework import serializers



class PrimaryAvatarField(serializers.RelatedField):


    def field_to_native(self, obj, field_name):
        try:
            a_path = get_primary_avatar(obj, 30) 
            if a_path:
                return self.to_native(a_path.avatar_url(30, 30))
            else:
                return self.to_native(get_default_avatar_url())
        except Avatar.DoesNotExist:
            return self.to_native(get_default_avatar_url())

    def to_native(self, value):
        return value

class UserSnapshoot(serializers.ModelSerializer):

    avatar_set = PrimaryAvatarField(many = True)

    class Meta:
       model = get_user_model()
       fields = ('username', 'avatar_set')

效果圖