【问题标题】:Is there a way to specify abstract functions which take in values for __init__有没有办法指定抽象函数接受 __init__ 的值
【发布时间】:2013-06-21 17:18:06
【问题描述】:

我不知道如何在标题中完整地说明这一点,所以请原谅我。本质上,我想定义一个 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 模型中获取一个对象,其中 pk 在 get 方法中给出。我猜想也许 BlogDetail 应该有某种 init 方法来定义如何处理我正在使用的模型的名称,但我不太确定这将如何工作

【问题讨论】:

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


    【解决方案1】:

    如何做通用 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)
    

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

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 2021-07-24
      • 2018-08-02
      • 2016-07-16
      • 2015-08-11
      • 1970-01-01
      相关资源
      最近更新 更多