diff options
| -rw-r--r-- | rest_framework/fields.py | 4 | ||||
| -rw-r--r-- | rest_framework/renderers.py | 12 | ||||
| -rw-r--r-- | rest_framework/serializers.py | 7 |
3 files changed, 18 insertions, 5 deletions
diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 5b406703..edc77e1a 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -180,6 +180,10 @@ class RelatedField(Field): Subclass this and override `convert` to define custom behaviour when serializing related objects. """ + def __init__(self, *args, **kwargs): + self.queryset = kwargs.pop('queryset', None) + super(RelatedField, self).__init__(*args, **kwargs) + def field_to_native(self, obj, field_name): obj = getattr(obj, self.source or field_name) if obj.__class__.__name__ in ('RelatedManager', 'ManyRelatedManager'): diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 9f0c26a5..96c5e170 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -246,7 +246,9 @@ class DocumentingHTMLRenderer(BaseRenderer): serializers.DateField: forms.DateField, serializers.EmailField: forms.EmailField, serializers.CharField: forms.CharField, - serializers.BooleanField: forms.BooleanField + serializers.BooleanField: forms.BooleanField, + serializers.PrimaryKeyRelatedField: forms.ChoiceField, + serializers.ManyPrimaryKeyRelatedField: forms.ModelMultipleChoiceField } # Creating an on the fly form see: http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python @@ -257,10 +259,16 @@ class DocumentingHTMLRenderer(BaseRenderer): serializer = view.get_serializer(instance=obj) for k, v in serializer.get_fields(True).items(): + print k, v if v.readonly: continue + + kwargs = {} + if getattr(v, 'queryset', None): + kwargs['queryset'] = getattr(v, 'queryset', None) + try: - fields[k] = field_mapping[v.__class__]() + fields[k] = field_mapping[v.__class__](**kwargs) except KeyError: fields[k] = forms.CharField() diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index d3ae9b8a..03763824 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -351,9 +351,10 @@ class ModelSerializer(RelatedField, Serializer): """ Creates a default instance of a flat relational field. """ + queryset = model_field.rel.to._default_manager # .using(db).complex_filter(self.rel.limit_choices_to) if isinstance(model_field, models.fields.related.ManyToManyField): - return ManyPrimaryKeyRelatedField() - return PrimaryKeyRelatedField() + return ManyPrimaryKeyRelatedField(queryset=queryset) + return PrimaryKeyRelatedField(queryset=queryset) def get_field(self, model_field): """ @@ -367,7 +368,7 @@ class ModelSerializer(RelatedField, Serializer): models.EmailField: EmailField, models.CharField: CharField, models.CommaSeparatedIntegerField: CharField, - models.BooleanField: BooleanField + models.BooleanField: BooleanField, } try: return field_mapping[model_field.__class__]() |
