Django Rest Framework - customizable hyperlink field in serializer

How to add custom hyperlink field in serializer? I would like to have a hyperlink field in my serializer that has query parameters in it. Since it is impossible to pass request parameters from HyperlinkedRelatedFieldor HyperlinkedIdentityField, as far as I know, I tried to use SerializerMethodField. However, this only serializes to a string and is not a clickable URL when visiting the API through my browser. My code looks something like this:

class MySerializer(serializers.HyperlinkedModelSerializer):
    custom_field = serializers.SerializerMethodField()

    class Meta:
        model = MyModel
        fields = ('url', 'custom_field')

    def get_custom_field(self, obj):
        result = '{}?{}'.format(
            reverse('my-view'),
            urllib.urlencode({'param': 'foo'})
        )
        return result

In addition, it is difficult for me to understand the difference between HyperlinkedRelatedFieldand a HyperlinkedIdentityField, so a brief explanation will be given.

+4
source share
1 answer

:

from rest_framework.reverse import reverse

class MySerializer(serializers.HyperlinkedModelSerializer):
    custom_field = serializers.SerializerMethodField()

    class Meta:
        model = MyModel
        fields = ('url', 'custom_field')

    def get_custom_field(self, obj):
        result = '{}?{}'.format(
            reverse('my-view', args=[obj.id], request=self.context['request']),
            'param=foo'
        )
        return result

rest_framework ( , ), args ( ), kwargs, ( self.context['request']). ( ), .

, URL- . , result ?{}&{}&{}, "param = foo" format , .

HyperlinkedIdentityField , . , HyperlinkedIdentifyField MyModel, HyperlinkedModelSerializer, HyperlinkedIdentityField , pk .

HyperlinkedRelatedField . , MySecondModel MyModel, MyModel MySecondModel, HyperlinkedRelatedField, , ( Meta):

class MySerializer(serializers.HyperlinkedModelSerializer):
    custom_field = serializers.SerializerMethodField()
    mysecondmodels = serializers.HyperlinkedRelatedField(
        many=True
        read_only=True,
        view_name='mysecondmodel-detail'
    )

    class Meta:
        model = MyModel
        fields = ('url', 'custom_field', 'mysecondmodels')

    def get_custom_field(self, obj):
        result = '{}?{}'.format(
            reverse('my-view', args=[obj.id], request=self.context['request']),
            'param=foo'
        )
        return result

OneToOneField, ForeignKey MySecondModel, many = False.

, !

0

Source: https://habr.com/ru/post/1629848/


All Articles