Django REST Framework - Serializing optional fields

后端 未结 6 1464
天涯浪人
天涯浪人 2020-12-08 19:30

I have an object that has optional fields. I have defined my serializer this way:

class ProductSerializer(serializers.Serializer):
    code = serializers.Fie         


        
6条回答
  •  一生所求
    2020-12-08 20:08

    DynamicSerializer for DRF 3, which allows dynamicly specifying which fields will be used in serializer, which will be excluded, and optionally which will become required!

    1. Create Mixin
        class DynamicSerializerMixin:
            """
            A Serializer that takes an additional `fields` argument that
            controls which fields should be used.
            """
    
            def __init__(self, *args, **kwargs):
                # Don't pass the 'fields' arg up to the superclass
                fields = kwargs.pop("fields", None)
                excluded_fields = kwargs.pop("excluded_fields", None)
                required_fields = kwargs.pop("required_fields", None)
    
                # Instantiate the superclass normally
                super().__init__(*args, **kwargs)
    
                if fields is not None:
                    # Drop any fields that are not specified in the `fields` argument.
                    allowed = set(fields)
                    existing = set(self.fields)
                    for field_name in existing - allowed:
                        self.fields.pop(field_name)
    
                    if isinstance(fields, dict):
                        for field, config in fields.items():
                            set_attrs(self.fields[field], config)
    
                if excluded_fields is not None:
                    # Drop any fields that are not specified in the `fields` argument.
                    for field_name in excluded_fields:
                        self.fields.pop(field_name)
    
                if required_fields is not None:
                    for field_name in required_fields:
                        self.fields[field_name].required = True
    
    1. Initialize/adjust your serializer by adding DynamicSerializerMixin to inheritence
    
    class UserProfileSerializer(DynamicSerializerMixin, serializers.ModelSerializer):
    
        class Meta:
            model = User
            fields = (
                "id",
                'first_name', 'last_name'
                "email",
                "is_staff",
            )
    
    1. Use it :)
    class RoleInvitationSerializer(serializers.ModelSerializer):
        invited_by = UserProfileSerializer(fields=['id', 'first_name', 'last_name'])
    

    or in action apis

        @action(detail=True, serializer_class=YourSerialzierClass)
        def teams_roles(self, request, pk=None):
            user = self.get_object()
            queryset = user.roles.all()
            serializer = self.get_serializer(queryset, many=True, excluded_fields=['user'])
            return Response(data=serializer.data)
    

提交回复
热议问题