diff --git a/rest_framework/generics.py b/rest_framework/generics.py index 7d1bf7945..4f134bce6 100644 --- a/rest_framework/generics.py +++ b/rest_framework/generics.py @@ -25,13 +25,13 @@ def strict_positive_int(integer_string, cutoff=None): ret = min(ret, cutoff) return ret -def get_object_or_404(queryset, **filter_kwargs): +def get_object_or_404(queryset, *filter_args, **filter_kwargs): """ Same as Django's standard shortcut, but make sure to raise 404 if the filter_kwargs don't match the required types. """ try: - return _get_object_or_404(queryset, **filter_kwargs) + return _get_object_or_404(queryset, *filter_args, **filter_kwargs) except (TypeError, ValueError): raise Http404 diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 8d2e0feb8..fb366594f 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -555,6 +555,7 @@ class ModelSerializerOptions(SerializerOptions): super(ModelSerializerOptions, self).__init__(meta) self.model = getattr(meta, 'model', None) self.read_only_fields = getattr(meta, 'read_only_fields', ()) + self.property_fields = getattr(meta, 'property_fields', ()) class ModelSerializer(Serializer): @@ -702,6 +703,10 @@ class ModelSerializer(Serializer): (field_name, self.__class__.__name__) ret[field_name].read_only = True + # For each of the `property_fields` construct a field + for property_name in self.opts.property_fields: + ret[property_name] = self.get_property_field(property_name) + return ret def get_pk_field(self, model_field): @@ -742,6 +747,9 @@ class ModelSerializer(Serializer): return PrimaryKeyRelatedField(**kwargs) + def get_property_field(self, model_property): + return CharField(read_only=True, source=model_property) + def get_field(self, model_field): """ Creates a default instance of a basic non-relational field.