在Django中使多表继承设计通用

发布于 2021-01-29 14:10:14

首先,提供一些指向我参考的页面的链接:一个SO问题,以及有关通用关系多表继承的Django文档。

到目前为止,我已经建立了一个多表继承设计。对象(例如:汽车,狗,计算机)可以继承Item类。我需要能够从数据库中检索项目,获取子类并对其进行处理。我的设计不允许一一检索不同类型的对象,因此我需要使用Item容器将它们全部包装为一个。有了Item后,Django文档说我可以通过使用模型名称(例如:myitem.car或myitem.computer)来引用属性来获取子类。

我不知道我的项目引用的是哪种类型的对象,那么我怎样才能得到孩子?有内置的方法可以做到这一点吗?这是我的一些其他想法:(有些疯狂)

  1. 我当时想我可以在引用孩子的Item上添加某种GenericForeignKey,但是我怀疑父类通过ForeignKey与子类进行关联甚至合法。
  2. 我想我可以在Item类中具有ForeignKey(ContentType),然后根据ContentType的名称找到Item的属性以获取子级。
  3. 最后,尽管这是一个丑陋的方法,但我也许可以保留一个对象类型列表,并尝试将每个类型用作属性,直到没有引发DidsNotExist错误为止。

如您所见,这些建议的解决方案并不那么优雅,但是我希望我不必使用其中一种,这里的人可能会有更好的建议。

提前致谢

关注者
0
被浏览
142
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我在一个项目中完成了与方法2类似的操作:

    from django.db import models
    from django.contrib.contenttypes.models import ContentType
    
    class BaseModel(models.Model):
        type = models.ForeignKey(ContentType,editable=False)
        # other base fields here
    
        def save(self,force_insert=False,force_update=False):
            if self.type_id is None:
                self.type = ContentType.objects.get_for_model(self.__class__)
            super(BaseModel,self).save(force_insert,force_update)
    
        def get_instance(self):
            return self.type.get_object_for_this_type(id=self.id)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看