我通过两种方式解决了这个问题。假设我有一个view A 和一个viewset B,并且我想从A 调用B.my_action。 B.my_action 处理特定的 id,例如用户 ID、产品 ID 等。
第一种方式
code w/in BViewSet
@action(detail=True, methods=['post'])
def my_action(self, request, pk=None):
try:
# works when you call from web UI, through router
# automatically you have one specific view corresponding
# to specific id e.g. user id, product id etc
instance = self.get_object()
except AttributeError as ae:
# here you don't have a specific view instantiated
# and you have many ids e.g. user ids, product ids etc
# pick one id
instance = MyModelObject.objects.get(id=pk)
# rest of code as is, no change
code w/in e.g. AView.utils.py that calls BViewSet.my_action
request 下面是调用AView 时传递给AView 的请求
通过网络用户界面。
from django.http import HttpRequest
data = BViewSet(detail=True)
new_request = HttpRequest()
new_request.data = any_data_I_need_to_pass # e.g. request.data
ret = data.my_action(new_request, pk=request.data['id'])
return ret
第二种方式
我将my_action 功能与my_action 调用分离,即
code w/in BViewSet
@action(detail=True, methods=['post'])
def my_action(self, request, pk=None):
instance = self.get_object()
ret = my_action_server(instance, request.data)
return Response(data=ret)
def my_action_server(instance, data):
# all code comes here
return result
code w/in Aview
# import my_action_server as needed
# call my_action_server
# AView should provide everything needed