我如何区分序列化器 DRF Django 中的请求操作

问题描述 投票:0回答:1
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。我怎样才能访问这个值?上下文/请求是否可用?

  1. 尝试了 self.action,没有成功。

    self.action
    导致
    EmailSerializer
    对象没有属性
    action

  2. 尝试过

    req=self.context['request']
    ,但它显示的是网址而不是操作

单次获取的输出

<rest_framework.request.Request: GET '/emails/17/'>

列表输出

<rest_framework.request.Request: GET '/emails/'>

如果自定义序列化程序是创建自定义链接以便通用输出显示彼此链接的好方法,有什么建议吗?

django django-rest-framework django-serializer
1个回答
0
投票

我找到了解决这个问题的方法。在序列化期间拥有与调用的 url 的操作不同的动态链接。

  1. 在 urls.py 中传递一个新的 var actionc

     path('emails/<int:pk>/', ERetrieveUpdateDeleteItem.as_view(actionc='detail') ,name='email-detail'),
    
  2. 在views.py中定义actionc类的属性

     class ERetrieveUpdateDeleteItem(generics.RetrieveUpdateDestroyAPIView):
         serializer_class = EmailSerializerU
         queryset = Email.objects.all()
         permission_classes = (AllowAny,)
         actionc = None
    
  3. 在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
    
  4. 序列化器中有一个函数 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
    
© www.soinside.com 2019 - 2024. All rights reserved.