首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得django模型的子类对象

如何获得django模型的子类对象
EN

Stack Overflow用户
提问于 2009-05-14 17:50:21
回答 4查看 854关注 0票数 2

当我有一个像这样的django模型类时:

代码语言:javascript
运行
复制
class BaseClass(models.Model):
     some_field = models.CharField(max_length = 80)
     ...

以及它的一些子类,例如

代码语言:javascript
运行
复制
class SomeClass(BaseClass):
     other_field =  models.CharField(max_length = 80)

然后,我知道我可以通过调用

代码语言:javascript
运行
复制
base  = BaseClass.objects.get(pk=3)
my_obj= base.someclass

现在出现的问题是,我有多个子类,而我所拥有的只是基类的一个实例。如何在不预先知道子类对象的情况下到达子类对象?

我们的想法是加载一个相应的视图,然后让它来完成这些工作。我的项目特性对于这些模型只有一组有限的默认操作,如视图、编辑、删除等。我不想通过URL公开给定对象的类型,因此“正常方式”不可用。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-14 18:22:47

没有一条内置的路。

也许最好的方法是在基类上定义一个derived_type字段,它是在派生类的保存时自动设置的。然后,可以在基础上有一个get_derived方法,它检查derived_type的值并返回实际的派生对象。

票数 3
EN

Stack Overflow用户

发布于 2009-05-14 17:57:12

如何在不预先知道子类对象的情况下到达子类对象?

这有什么用呢?如果您不知道您想要哪个类,那么您也不知道要调用哪些方法或可以检查哪些属性。

我们的想法是加载一个相应的视图,然后让它来完成这些工作。我的项目特性对于这些模型只有一组有限的默认操作,如视图、编辑、删除等。我不想通过URL公开给定对象的类型,因此“正常方式”不可用。

如果您提前知道了一组模型子类,或者愿意将它们注册到一个中央视图列表中,那么您可以这样做:

代码语言:javascript
运行
复制
VIEWS = [('subclass_a', a_views), ('subclass_b', b_views)]

def edit(request):
    base = (get base somehow)

    for attrname, views in VIEWS:
        if getattr(base, attrname) is not None:
            return views['edit']

根据您有多少不同类型的视图,您可以将搜索抽象到一个单独的函数中,因此结束视图如下所示:

代码语言:javascript
运行
复制
def edit(request):
    return generic_base_view(request, 'edit')
票数 2
EN

Stack Overflow用户

发布于 2012-03-22 10:05:57

对于研究这个问题的人来说,这个问题发布的时间比发布的要晚一些,并且在较新版本的django中给出了被接受的答案,这是可能的,请参阅:关于多表继承的django文档

看看地方和餐馆的例子。基本对象是place,子类是餐馆。您可以通过place.restaurant获得子类,这会给出一个异常,如果这个地方不是餐馆,就可以捕获它。我加上这一点,是因为接受的答案可能有点过时,使我走错了轨道。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/864769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档