From e52d4e82097f30bb68d0a52b8ead43db22181f60 Mon Sep 17 00:00:00 2001 From: 954 <510485871@qq.com> Date: Mon, 24 Oct 2022 11:39:02 +0800 Subject: [PATCH 01/11] Fixes 'RelatedManager' object is not iterable in ListSerializer.to_representation.(#8726) --- rest_framework/serializers.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 052a766cd8..8bb28e3f8b 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -681,7 +681,9 @@ def to_representation(self, data): """ # Dealing with nested relationships, data can be a Manager, # so, first get a queryset from the Manager if needed - iterable = data.all() if isinstance(data, models.Manager) else data + iterable = data.all() if isinstance(data, ( + models.manager.Manager, models.manager.BaseManager + )) else data return [ self.child.to_representation(item) for item in iterable From 61becb6bc634720ca7669c64079886f6b106738a Mon Sep 17 00:00:00 2001 From: 954 <510485871@qq.com> Date: Tue, 25 Oct 2022 07:58:26 +0800 Subject: [PATCH 02/11] Change to only BaseManager --- rest_framework/serializers.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8bb28e3f8b..9dfb90f769 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -681,9 +681,7 @@ def to_representation(self, data): """ # Dealing with nested relationships, data can be a Manager, # so, first get a queryset from the Manager if needed - iterable = data.all() if isinstance(data, ( - models.manager.Manager, models.manager.BaseManager - )) else data + iterable = data.all() if isinstance(data, models.manager.BaseManager) else data return [ self.child.to_representation(item) for item in iterable From 2137b1e849813fe54bd96e93e83b44382730ad2b Mon Sep 17 00:00:00 2001 From: 954 <510485871@qq.com> Date: Tue, 22 Nov 2022 13:01:17 +0800 Subject: [PATCH 03/11] Commit unit test --- tests/models.py | 26 ++++++++++++++++++++ tests/test_serializer_lists.py | 45 ++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/tests/models.py b/tests/models.py index 666e9f0031..88e3d8dcaf 100644 --- a/tests/models.py +++ b/tests/models.py @@ -2,6 +2,8 @@ from django.contrib.auth.models import User from django.db import models +from django.db.models import QuerySet +from django.db.models.manager import BaseManager from django.utils.translation import gettext_lazy as _ @@ -124,3 +126,27 @@ class OneToOnePKSource(RESTFrameworkModel): target = models.OneToOneField( OneToOneTarget, primary_key=True, related_name='required_source', on_delete=models.CASCADE) + + +class CustomManagerModel(RESTFrameworkModel): + class CustomManager: + def __new__(cls, *args, **kwargs): + cls = BaseManager.from_queryset( + QuerySet + ) + return cls + + objects = CustomManager()() + # `CustomManager()` will return a `BaseManager` class. + # We need to instantiation it, so we write `CustomManager()()` here. + + text = models.CharField( + max_length=100, + verbose_name=_("Text comes here"), + help_text=_("Text description.") + ) + + o2o_target = models.ForeignKey(OneToOneTarget, + help_text='OneToOneTarget', + verbose_name='OneToOneTarget', + on_delete=models.CASCADE) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index 4b60643a85..74af2f3d8e 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -6,6 +6,11 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail +from tests.models import ( + CustomManagerModel, + NullableOneToOneSource, + OneToOneTarget +) class BasicObject: @@ -683,3 +688,43 @@ def test_min_max_length_six_items(self): assert min_serializer.validated_data == input_data assert not max_min_serializer.is_valid() + + +@pytest.mark.django_db() +class TestToRepresentationManagerCheck: + """ + https://github.com/encode/django-rest-framework/issues/8726 + """ + + def setup(self): + class CustomManagerModelSerializer(serializers.ModelSerializer): + class Meta: + model = CustomManagerModel + fields = '__all__' + + class OneToOneTargetSerializer(serializers.ModelSerializer): + my_model = CustomManagerModelSerializer(many=True, source="custommanagermodel_set") + + class Meta: + model = OneToOneTarget + fields = '__all__' + depth = 3 + + class NullableOneToOneSourceSerializer(serializers.ModelSerializer): + target = OneToOneTargetSerializer() + + class Meta: + model = NullableOneToOneSource + fields = '__all__' + + self.serializer = NullableOneToOneSourceSerializer + + def test(self): + o2o_target = OneToOneTarget.objects.create(name='OneToOneTarget') + NullableOneToOneSource.objects.create( + name='NullableOneToOneSource', + target=o2o_target + ) + queryset = NullableOneToOneSource.objects.all() + serializer = self.serializer(queryset, many=True) + assert serializer.data From c3f343bc7cebb21c807ef48512c0a549a2aedf12 Mon Sep 17 00:00:00 2001 From: Asif Saif Uddin Date: Tue, 22 Nov 2022 11:12:17 +0600 Subject: [PATCH 04/11] Update tests/test_serializer_lists.py --- tests/test_serializer_lists.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index 74af2f3d8e..732a1fb6f2 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -696,7 +696,7 @@ class TestToRepresentationManagerCheck: https://github.com/encode/django-rest-framework/issues/8726 """ - def setup(self): + def setup_method(self): class CustomManagerModelSerializer(serializers.ModelSerializer): class Meta: model = CustomManagerModel From 1fe232eb75770b3fbf747e47f5e428f6de04961c Mon Sep 17 00:00:00 2001 From: Asif Saif Uddin Date: Tue, 22 Nov 2022 11:32:03 +0600 Subject: [PATCH 05/11] Update tests/test_serializer_lists.py --- tests/test_serializer_lists.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index 732a1fb6f2..9cc2f7eaad 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -6,7 +6,7 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail -from tests.models import ( +from tests.models import (CustomManagerModel, NullableOneToOneSource, OneToOneTarget) CustomManagerModel, NullableOneToOneSource, OneToOneTarget From 2741f06515ab0f4bc2aec9c0fe4a2a3e567a66a0 Mon Sep 17 00:00:00 2001 From: Asif Saif Uddin Date: Tue, 22 Nov 2022 11:32:13 +0600 Subject: [PATCH 06/11] Update tests/test_serializer_lists.py --- tests/test_serializer_lists.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index 9cc2f7eaad..4f9a421871 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -7,7 +7,6 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail from tests.models import (CustomManagerModel, NullableOneToOneSource, OneToOneTarget) - CustomManagerModel, NullableOneToOneSource, OneToOneTarget ) From adc5ad62d5f7c2d25f2e0ef70b1c58e2cb474a8c Mon Sep 17 00:00:00 2001 From: Asif Saif Uddin Date: Tue, 22 Nov 2022 11:32:25 +0600 Subject: [PATCH 07/11] Update tests/test_serializer_lists.py --- tests/test_serializer_lists.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index 4f9a421871..daa5765ce1 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -7,7 +7,6 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail from tests.models import (CustomManagerModel, NullableOneToOneSource, OneToOneTarget) - NullableOneToOneSource, OneToOneTarget ) From c3ee8386b5da25eef14004ae94081d6d6a943f18 Mon Sep 17 00:00:00 2001 From: Asif Saif Uddin Date: Tue, 22 Nov 2022 11:32:38 +0600 Subject: [PATCH 08/11] Update tests/test_serializer_lists.py --- tests/test_serializer_lists.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index daa5765ce1..7aac57c243 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -7,7 +7,6 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail from tests.models import (CustomManagerModel, NullableOneToOneSource, OneToOneTarget) - OneToOneTarget ) From 0aa817c1d88f127634fe11f818f8dd1a9eeecc81 Mon Sep 17 00:00:00 2001 From: Asif Saif Uddin Date: Tue, 22 Nov 2022 11:33:31 +0600 Subject: [PATCH 09/11] Update tests/test_serializer_lists.py --- tests/test_serializer_lists.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index 7aac57c243..8d5312316e 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -7,7 +7,6 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail from tests.models import (CustomManagerModel, NullableOneToOneSource, OneToOneTarget) -) class BasicObject: From fbe3de34cd1cd8e3b661bc5de0add3fe16148237 Mon Sep 17 00:00:00 2001 From: 954 <510485871@qq.com> Date: Tue, 22 Nov 2022 13:32:13 +0800 Subject: [PATCH 10/11] Format import --- tests/test_serializer_lists.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index 8d5312316e..dc24dcb6ca 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -6,7 +6,7 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail -from tests.models import (CustomManagerModel, NullableOneToOneSource, OneToOneTarget) +from tests.models import CustomManagerModel, NullableOneToOneSource, OneToOneTarget class BasicObject: From 85eb12ec3860f94c4ef5a1ccf39ef85cf804da35 Mon Sep 17 00:00:00 2001 From: 954 <510485871@qq.com> Date: Tue, 22 Nov 2022 13:38:48 +0800 Subject: [PATCH 11/11] Format import --- tests/test_serializer_lists.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_serializer_lists.py b/tests/test_serializer_lists.py index dc24dcb6ca..10463d29ab 100644 --- a/tests/test_serializer_lists.py +++ b/tests/test_serializer_lists.py @@ -6,7 +6,9 @@ from rest_framework import serializers from rest_framework.exceptions import ErrorDetail -from tests.models import CustomManagerModel, NullableOneToOneSource, OneToOneTarget +from tests.models import ( + CustomManagerModel, NullableOneToOneSource, OneToOneTarget +) class BasicObject: