class EmailSerializerU(serializers.ModelSerializer):
customlink = serializers.SerializerMethodField()
class Meta:
model = Email
fields = ['id','owner','address','type','primary','customlink']
def get_customlink(self, instance):
#Here Logic IF Action=List then A) IF Action=GET THEN b)
req=self.context['request']
full_url = ''.join(['http://', get_current_site(req).domain])+'/emails'
return full_url
在 def_get_customlink 函数中,我尝试根据 URL/API 的操作设置 full_url。我怎样才能访问这个值?上下文/请求是否可用?
尝试了 self.action,没有成功。
self.action
导致 EmailSerializer
对象没有属性 action
尝试过
req=self.context['request']
,但它显示的是网址而不是操作
单次获取的输出
<rest_framework.request.Request: GET '/emails/17/'>
列表输出
<rest_framework.request.Request: GET '/emails/'>
如果自定义序列化程序是创建自定义链接以便通用输出显示彼此链接的好方法,有什么建议吗?
我找到了解决这个问题的方法。在序列化期间拥有与调用的 url 的操作不同的动态链接。
在 urls.py 中传递一个新的 var actionc
path('emails/<int:pk>/', ERetrieveUpdateDeleteItem.as_view(actionc='detail') ,name='email-detail'),
在views.py中定义actionc类的属性
class ERetrieveUpdateDeleteItem(generics.RetrieveUpdateDestroyAPIView):
serializer_class = EmailSerializerU
queryset = Email.objects.all()
permission_classes = (AllowAny,)
actionc = None
在views.py中将actionc传递给序列化器上下文
def get_serializer_context(self):
context = super(ERetrieveUpdateDeleteItem, self).get_serializer_context()
print(self.request.GET.urlencode())
context.update({"actionc": self.actionc})
return context
序列化器中有一个函数 to_representation 。用它来 添加额外的内容,在本例中是动态链接
class EmailSerializerU(serializers.ModelSerializer):
class Meta:
model = Email
fields = ['id','owner','address','type','primary']
def to_representation(self, instance):
req=self.context['request']
actionc=self.context['actionc']
representation = super().to_representation(instance)
if actionc=='detail':
full_url = ''.join(['http://', get_current_site(req).domain])+'/emails'
representation['add_info'] = full_url
else:
full_url = ''.join(['http://', get_current_site(req).domain])+instance.get_absolute_url()
representation['add_info'] = full_url
return representation