Skip to content

Instantly share code, notes, and snippets.

@Mark-Shine
Created January 22, 2015 08:19
Show Gist options
  • Save Mark-Shine/307367f5106ea313502d to your computer and use it in GitHub Desktop.
Save Mark-Shine/307367f5106ea313502d to your computer and use it in GitHub Desktop.
get user's follows and fans
def build_user_FOO(foo, serializer_class_name, query_param=None):
if foo not in ['follows', 'fans', 'order_set']:
raise AttributeError
##todo check SerializerClass
get_class = lambda x: globals()[x]
@api_view(["GET"])
@authentication_classes((TokenAuthentication, ))
def get_user_foo(request, pk):
### get user B
user = get_object_or_404(UserProfile, pk=pk)
#get user B's foo
foo_manage = getattr(user, foo)
##q used for query condition
q = query_param and Q(**query_param) or None
if q:
queryset = foo_manage.filter(q)
else:
queryset = foo_manage.filter()
paginator = Paginator(queryset, 10)
page = request.QUERY_PARAMS.get('page')
try:
users = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
users = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999),
# deliver last page of results.
users = paginator.page(paginator.num_pages)
serializer_context = {'request': request}
serializer_class = get_class(serializer_class_name)
serializer = serializer_class(users, context=serializer_context)
return Response(serializer.data)
return get_user_foo
get_user_follows = build_user_FOO('follows', 'PaginatedUserSerializer')
get_user_fans = build_user_FOO('fans', "PaginatedUserSerializer")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment