python - 有没有办法指定接受 __init__ 值的抽象函数

标签 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

这样当我定义 View 时,就会自动定义这个 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 方法,它定义如何处理我正在使用的模型的名称,但我不太确定这是如何工作的

最佳答案

如何执行通用 Django 基于类的 View 的操作并拥有需要设置的 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)

当然,这是一个粗略的示例,您希望使其更加健壮......

关于python - 有没有办法指定接受 __init__ 值的抽象函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17240885/

相关文章:

python - 如何在不同的分隔符上拆分字符串,但保留某些所述分隔符的输出? (标记字符串)

python - 如何在cygwin中使用conda

python - 升级到Django 1.7 : Getting AppRegistryNotReady for translation infrastructure

sql-server - django-pyodbc-azure。对象名称无效 'django_session'

Django 模型字段索引

sql - 带有 "isnull"参数的 Django 查询集返回重复项

python - win32com.client.Dispatch 有效但 win32com.client.gencache.EnsureDispatch 无效

python - 编程中使用的开发人员工具

django - 如何更改 Django 管理中特定字段类型的呈现?

python - Django 模型属性引用任意模型实例