diff options
| -rw-r--r-- | djangorestframework/resources.py | 40 | ||||
| -rw-r--r-- | docs/examples/modelresources.rst | 7 | ||||
| -rw-r--r-- | docs/index.rst | 28 |
3 files changed, 35 insertions, 40 deletions
diff --git a/djangorestframework/resources.py b/djangorestframework/resources.py index adf5c1c3..36bad914 100644 --- a/djangorestframework/resources.py +++ b/djangorestframework/resources.py @@ -44,7 +44,7 @@ def _model_to_dict(instance, resource=None): include = resource and resource.include or () exclude = resource and resource.exclude or () - extra_fields = fields and list(resource.fields) or [] + extra_fields = fields and list(fields) or list(include) # Model fields for f in opts.fields + opts.many_to_many: @@ -62,21 +62,26 @@ def _model_to_dict(instance, resource=None): # Method fields for fname in extra_fields: - if hasattr(resource, fname): - # check the resource first, to allow it to override fields - obj = getattr(resource, fname) - # if it's a method like foo(self, instance), then call it - if inspect.ismethod(obj) and len(inspect.getargspec(obj)[0]) == 2: - obj = obj(instance) - elif hasattr(instance, fname): - # now check the object instance - obj = getattr(instance, fname) - else: - continue + try: + if hasattr(resource, fname): + # check the resource first, to allow it to override fields + obj = getattr(resource, fname) + # if it's a method like foo(self, instance), then call it + if inspect.ismethod(obj) and len(inspect.getargspec(obj)[0]) == 2: + obj = obj(instance) + elif hasattr(instance, fname): + # now check the object instance + obj = getattr(instance, fname) + else: + continue + + # TODO: It would be nicer if this didn't recurse here. + # Let's keep _model_to_dict flat, and _object_to_data recursive. + data[fname] = _object_to_data(obj) - # TODO: It would be nicer if this didn't recurse here. - # Let's keep _model_to_dict flat, and _object_to_data recursive. - data[fname] = _object_to_data(obj) + except NoReverseMatch: + # Ug, bit of a hack for now + pass return data @@ -223,7 +228,7 @@ class FormResource(Resource): # In addition to regular validation we also ensure no additional fields are being passed in... unknown_fields = seen_fields_set - (form_fields_set | allowed_extra_fields_set) - unknown_fields = unknown_fields - set(('csrfmiddlewaretoken', '_accept')) # TODO: Ugh. + unknown_fields = unknown_fields - set(('csrfmiddlewaretoken', '_accept', '_method')) # TODO: Ugh. # Check using both regular validation, and our stricter no additional fields rule if bound_form.is_valid() and not unknown_fields: @@ -437,6 +442,9 @@ class ModelResource(FormResource): This method can be overridden if you need to set the resource url reversing explicitly. """ + if not hasattr(self, 'view_callable'): + raise NoReverseMatch + # dis does teh magicks... urlconf = get_urlconf() resolver = get_resolver(urlconf) diff --git a/docs/examples/modelresources.rst b/docs/examples/modelresources.rst index 676656a7..375e4a8d 100644 --- a/docs/examples/modelresources.rst +++ b/docs/examples/modelresources.rst @@ -32,13 +32,6 @@ Here's the models we're working from in this example. It's usually a good idea .. include:: ../../examples/modelresourceexample/models.py :literal: -Now that we've got some models and a urlconf, there's very little code to write. We'll create a :class:`.ModelResource` to map to instances of our models, and a top level :class:`.RootModelResource` to list the existing instances and to create new instances. - -``views.py`` - -.. include:: ../../examples/modelresourceexample/views.py - :literal: - And we're done. We've now got a fully browseable API, which supports multiple input and output media types, and has all the nice automatic field validation that Django gives us for free. We can visit the API in our browser: diff --git a/docs/index.rst b/docs/index.rst index 88c3bac2..866ad444 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -70,28 +70,22 @@ For more information on settings take a look at the :ref:`setup` section. Getting Started --------------- -Using Django REST framework can be as simple as adding a few lines to your urlconf and adding a `permalink <http://docs.djangoproject.com/en/dev/ref/models/instances/#get-absolute-url>`_ to your model. +Using Django REST framework can be as simple as adding a few lines to your urlconf. -`urls.py`:: +``urls.py``:: from django.conf.urls.defaults import patterns, url - from djangorestframework import ModelResource, RootModelResource - from models import MyModel + from djangorestframework.resources import ModelResource + from djangorestframework.views import ListOrCreateModelView, InstanceModelView + from myapp.models import MyModel + + class MyResource(ModelResource): + model = MyModel urlpatterns = patterns('', - url(r'^$', RootModelResource.as_view(model=MyModel)), - url(r'^(?P<pk>[^/]+)/$', ModelResource.as_view(model=MyModel), name='my-model'), - ) - -`models.py`:: - - class MyModel(models.Model): - - # (Rest of model definition...) - - @models.permalink - def get_absolute_url(self): - return ('my-model', (self.pk,)) + url(r'^$', RootModelResource.as_view(resource=MyResource)), + url(r'^(?P<pk>[^/]+)/$', ModelResource.as_view(resource=MyResource)), + ) Django REST framework comes with two "getting started" examples. |
