mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-29 17:39:48 +03:00
Use the str representation of a queryset instead of the __repr__
This way, if the serializer is inadvertently converted to a string, the queryset won't be executed.
This commit is contained in:
parent
ec29ff8a80
commit
2ff4974045
|
@ -23,10 +23,17 @@ def manager_repr(value):
|
||||||
return repr(value)
|
return repr(value)
|
||||||
|
|
||||||
|
|
||||||
|
def queryset_repr(queryset):
|
||||||
|
return "{}".format(queryset.query)
|
||||||
|
|
||||||
|
|
||||||
def smart_repr(value):
|
def smart_repr(value):
|
||||||
if isinstance(value, models.Manager):
|
if isinstance(value, models.Manager):
|
||||||
return manager_repr(value)
|
return manager_repr(value)
|
||||||
|
|
||||||
|
if isinstance(value, models.QuerySet):
|
||||||
|
value = queryset_repr(value)
|
||||||
|
|
||||||
if isinstance(value, Promise) and value._delegate_text:
|
if isinstance(value, Promise) and value._delegate_text:
|
||||||
value = force_str(value)
|
value = force_str(value)
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ from django.db.models.signals import m2m_changed
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers, fields
|
||||||
from rest_framework.compat import postgres_fields
|
from rest_framework.compat import postgres_fields
|
||||||
|
|
||||||
from .models import NestedForeignKeySource
|
from .models import NestedForeignKeySource
|
||||||
|
@ -559,6 +559,18 @@ class TestRelationalFieldMappings(TestCase):
|
||||||
""")
|
""")
|
||||||
self.assertEqual(repr(TestSerializer()), expected)
|
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):
|
def test_nested_relations(self):
|
||||||
class TestSerializer(serializers.ModelSerializer):
|
class TestSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user