当我有一个像这样的django模型类时:
class BaseClass(models.Model):
some_field = models.CharField(max_length = 80)
...以及它的一些子类,例如
class SomeClass(BaseClass):
other_field = models.CharField(max_length = 80)然后,我知道我可以通过调用
base = BaseClass.objects.get(pk=3)
my_obj= base.someclass现在出现的问题是,我有多个子类,而我所拥有的只是基类的一个实例。如何在不预先知道子类对象的情况下到达子类对象?
我们的想法是加载一个相应的视图,然后让它来完成这些工作。我的项目特性对于这些模型只有一组有限的默认操作,如视图、编辑、删除等。我不想通过URL公开给定对象的类型,因此“正常方式”不可用。
发布于 2009-05-14 18:22:47
没有一条内置的路。
也许最好的方法是在基类上定义一个derived_type字段,它是在派生类的保存时自动设置的。然后,可以在基础上有一个get_derived方法,它检查derived_type的值并返回实际的派生对象。
发布于 2009-05-14 17:57:12
如何在不预先知道子类对象的情况下到达子类对象?
这有什么用呢?如果您不知道您想要哪个类,那么您也不知道要调用哪些方法或可以检查哪些属性。
我们的想法是加载一个相应的视图,然后让它来完成这些工作。我的项目特性对于这些模型只有一组有限的默认操作,如视图、编辑、删除等。我不想通过URL公开给定对象的类型,因此“正常方式”不可用。
如果您提前知道了一组模型子类,或者愿意将它们注册到一个中央视图列表中,那么您可以这样做:
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']根据您有多少不同类型的视图,您可以将搜索抽象到一个单独的函数中,因此结束视图如下所示:
def edit(request):
return generic_base_view(request, 'edit')发布于 2012-03-22 10:05:57
对于研究这个问题的人来说,这个问题发布的时间比发布的要晚一些,并且在较新版本的django中给出了被接受的答案,这是可能的,请参阅:关于多表继承的django文档。
看看地方和餐馆的例子。基本对象是place,子类是餐馆。您可以通过place.restaurant获得子类,这会给出一个异常,如果这个地方不是餐馆,就可以捕获它。我加上这一点,是因为接受的答案可能有点过时,使我走错了轨道。
https://stackoverflow.com/questions/864769
复制相似问题