有没有办法指定引入__init__值的抽象函数

时间:2013-06-21 17:18:07

标签: python django django-models abstract-class django-rest-framework

我不确定如何在标题中完全指定,所以请原谅我。本质上,我想定义一个方法get_object()方法,就像这里描述的那样

http://django-rest-framework.org/tutorial/3-class-based-views.html#rewriting-our-api-using-class-based-views

但是以抽象的方式。例如,假设我想将APIView扩展为

class BetterAPIView(APIView):
    def get_object(self, pk):
        try:
            return ***Class name***.objects.get(pk=pk)
        catch:
            raise Http404

因此,当我定义一个视图时,这个get_object方法有一个自动定义。例如,如果我对博客文章的观点是

class BlogDetail(BetterAPIView):

    def get(self, request, pk, format=None):
        Post = Post.get_object(pk)

我希望get_object方法自动知道Post.get_object(pk)意味着我想从Post模型中获取一个对象,并在get方法中给出了pk。我猜可能BlogDetail应该有某种 init 方法,该方法定义了如何处理我正在使用的模型的名称,但我不太清楚这是如何工作的

1 个答案:

答案 0 :(得分:2)

如何执行基于Django类的通用视图,并且需要设置model属性?

class BetterAPIView(APIView):
    model = None

    def __init__(self, *args, **kwargs):
        if self.model is None:
            raise SomeSortOfConfigurationException
        super(BetterAPIView, self).__init__(*args, **kwargs)

    def get_object(self, pk):
        try:
            return self.model.objects.get(pk=pk)
        catch:
            raise Http404

现在:

class BlogDetail(BetterAPIView):
    model = Post

    def get(self, request, pk, format=None):
        post = self.get_object(pk)

当然,这是一个粗略的例子,你想让它更健壮......