Django-rest-framework: set default rendering not working?

I am trying to create a REST API Django-rest-framework, which by default outputs JSON but also has XML.

I read the chapter in the Renderers section of the default order documentation section and put this in my settings file:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
        'rest_framework_xml.renderers.XMLRenderer',
    )
}

However, this outputs XML by default. Switching an order does not matter.

I get JSON if I add format=jsonto the url, and if I delete the string XMLRendereras a whole.

How to set JSON by default?

I am using v1.7 Django and v3.1.1 Django-rest-framework.

UPDATE: as requested here is the code for my views:

class CountyViewSet(viewsets.ModelViewSet):
    queryset = County.objects.all()
    serializer_class = CountySerializer

And serializer:

from rest_framework import serializers
class CountySerializer(serializers.ModelSerializer):
    class Meta:
        model = County
        fields = ('id', 'name', 'name_slug', 'ordering')

And finally, from my urls file:

router = routers.DefaultRouter()
router.register(r'county', CountyViewSet)
urlpatterns = [
    url(r'^', include(router.urls)),
]
+4
3

?

renderer_classes ? .

class YourView(APIView):
    renderer_classes = (XMLRenderer, JSONRenderer, )
0

, , , , , XML JSON Accepts. - Django REST XML, , , .

DRF , , " , ". DRF Accepts, . , Accepts, .

0

my solution: renderers.py file

from rest_framework.negotiation import DefaultContentNegotiation

class IgnoreClientContentNegotiation(DefaultContentNegotiation):

    logger = logging.getLogger(__name__)
    def select_renderer(self, request, renderers, format_suffix):
        """
        Select the first renderer in the `.renderer_classes` list.
        """
        # Allow URL style format override.  eg. "?format=json
        format_query_param = self.settings.URL_FORMAT_OVERRIDE
        format = format_suffix or request.query_params.get(format_query_param)
        request.query_params.get(format_query_param), format))

        if format is None:
            return (renderers[0], renderers[0].media_type)
        else:
            return DefaultContentNegotiation.select_renderer(self, request, renderers, format_suffix)

Now you just need to add to settings.py in

REST_FRAMEWORK = { 
 (...)
'DEFAULT_CONTENT_NEGOTIATION_CLASS': 'myapp.renderers.IgnoreClientContentNegotiation',
}
0
source

All Articles