Django REST框架中View的继承层次结构

时间:2012-03-06 01:00:33

标签: python django

显然,使用Django REST框架的视图只能有一个级别的继承。

这有效:

class Foo(View):
    def get(self, request):
        return "hello world"

虽然这不是:

class Foo(View):
    def get(self, request):
        return self.bar()

class Bar(Foo):
    def bar(self):
        return "hello world"

由于as_view()中的代码,这似乎是故意的 http://django-rest-framework.org/_modules/views.html

有没有人知道解决方法?

谢谢!

编辑: 好吧,我发现我能做到:

class Foo(View):
    def __init__(self):
        View.__init__(proxy = self)

    def get(self, request):
        return self.proxy.bar()

class Bar(Foo):
    def bar(self):
        return "hello world"

但从长远来看,这并非真正“可接受”。有谁知道更合理的方式吗?

1 个答案:

答案 0 :(得分:0)

如果这个问题仍然存在,我认为我们没有足够的信息来回答这个问题。

首先,

class Foo(object):
    def get(self):
        return self.bar()

class Bar(Foo):
    def bar(self):
        return "hello world"
无论Foo是否扩展了django-rest-framework的View类,

在任何情况下都可能不是好代码。假设它有一个bar方法,你实际上是在破坏foo.get,但它没有。

>>> foo = Foo()
>>> foo.get()
AttributeError: 'Foo' object has no attribute 'bar'

此:

>>> bar = Bar()
>>> bar.get() 

会奏效。但是,你通过这种方式编写它实际上毁了Foo。至少提供一个存根方法。

无论如何,你还没有发布你的urls.py,所以我不确定你是在尝试做Foo.as_view()还是Bar.as_view()。我用djangorestframework.views.View测试了它。 ,并且,正如预期的那样,

#urls.py
from testviews.views import Foo, Bar
urlpatterns = patterns('',
    url(r'^$', Bar.as_view(), name='home'),
)

对我来说很好,而

urlpatterns = patterns('',
    url(r'^$', Foo.as_view(), name='home'),
) 

与上述代码不起作用的原因相同。