Skip to content

Commit

Permalink
Allowed Q objects in limit_choices_to introspection.
Browse files Browse the repository at this point in the history
Closes encode#6470.
  • Loading branch information
carltongibson committed Feb 25, 2019
1 parent 07c5c96 commit 7df425f
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
4 changes: 3 additions & 1 deletion rest_framework/utils/field_mapping.py
Expand Up @@ -251,7 +251,9 @@ def get_relation_kwargs(field_name, relation_info):

limit_choices_to = model_field and model_field.get_limit_choices_to()
if limit_choices_to:
kwargs['queryset'] = kwargs['queryset'].filter(**limit_choices_to)
if not isinstance(limit_choices_to, models.Q):
limit_choices_to = models.Q(**limit_choices_to)
kwargs['queryset'] = kwargs['queryset'].filter(limit_choices_to)

if has_through_model:
kwargs['read_only'] = True
Expand Down
7 changes: 7 additions & 0 deletions tests/models.py
Expand Up @@ -59,6 +59,13 @@ class ForeignKeySourceWithLimitedChoices(RESTFrameworkModel):
on_delete=models.CASCADE)


class ForeignKeySourceWithQLimitedChoices(RESTFrameworkModel):
target = models.ForeignKey(ForeignKeyTarget, help_text='Target',
verbose_name='Target',
limit_choices_to=models.Q(name__startswith="limited-"),
on_delete=models.CASCADE)


# Nullable ForeignKey
class NullableForeignKeySource(RESTFrameworkModel):
name = models.CharField(max_length=100)
Expand Down
21 changes: 17 additions & 4 deletions tests/test_relations_pk.py
Expand Up @@ -5,10 +5,11 @@

from rest_framework import serializers
from tests.models import (
ForeignKeySource, ForeignKeySourceWithLimitedChoices, ForeignKeyTarget,
ManyToManySource, ManyToManyTarget, NullableForeignKeySource,
NullableOneToOneSource, NullableUUIDForeignKeySource, OneToOnePKSource,
OneToOneTarget, UUIDForeignKeyTarget
ForeignKeySource, ForeignKeySourceWithLimitedChoices,
ForeignKeySourceWithQLimitedChoices, ForeignKeyTarget, ManyToManySource,
ManyToManyTarget, NullableForeignKeySource, NullableOneToOneSource,
NullableUUIDForeignKeySource, OneToOnePKSource, OneToOneTarget,
UUIDForeignKeyTarget
)


Expand Down Expand Up @@ -378,6 +379,18 @@ def test_queryset_size_with_limited_choices(self):
queryset = ForeignKeySourceWithLimitedChoicesSerializer().fields["target"].get_queryset()
assert len(queryset) == 1

def test_queryset_size_with_Q_limited_choices(self):
limited_target = ForeignKeyTarget(name="limited-target")
limited_target.save()

class QLimitedChoicesSerializer(serializers.ModelSerializer):
class Meta:
model = ForeignKeySourceWithQLimitedChoices
fields = ("id", "target")

queryset = QLimitedChoicesSerializer().fields["target"].get_queryset()
assert len(queryset) == 1


class PKNullableForeignKeyTests(TestCase):
def setUp(self):
Expand Down

0 comments on commit 7df425f

Please sign in to comment.