diff --git a/rest_framework/utils/representation.py b/rest_framework/utils/representation.py index 6f2efee16..7bffa7878 100644 --- a/rest_framework/utils/representation.py +++ b/rest_framework/utils/representation.py @@ -23,10 +23,17 @@ def manager_repr(value): return repr(value) +def queryset_repr(queryset): + return "{}".format(queryset.query) + + def smart_repr(value): if isinstance(value, models.Manager): return manager_repr(value) + if isinstance(value, models.QuerySet): + value = queryset_repr(value) + if isinstance(value, Promise) and value._delegate_text: value = force_str(value) diff --git a/tests/test_model_serializer.py b/tests/test_model_serializer.py index 7da1b41ae..30f22c0c2 100644 --- a/tests/test_model_serializer.py +++ b/tests/test_model_serializer.py @@ -23,7 +23,7 @@ from django.db.models.signals import m2m_changed from django.dispatch import receiver from django.test import TestCase -from rest_framework import serializers +from rest_framework import serializers, fields from rest_framework.compat import postgres_fields from .models import NestedForeignKeySource @@ -559,6 +559,18 @@ class TestRelationalFieldMappings(TestCase): """) self.assertEqual(repr(TestSerializer()), expected) + def test_manual_pk_relation_will_customize_queryset_repr_to_avoid_execute_it(self): + queryset = ForeignKeyTargetModel.objects.all() + + class TestSerializer(serializers.Serializer): + field = serializers.PrimaryKeyRelatedField(queryset=queryset) + + expected = dedent(""" + TestSerializer(): + field = PrimaryKeyRelatedField(queryset='{}') + """) + self.assertEqual(repr(TestSerializer()), expected.format(queryset.query)) + def test_nested_relations(self): class TestSerializer(serializers.ModelSerializer): class Meta: