当前位置: 首页 > 面试题库 >

如何在不知道子类名称的情况下访问Django对象的子类?

邢献
2023-03-14
问题内容

在Django中,当您有一个父类和从其继承的多个子类时,通常可以通过parentclass.childclass1_set或parentclass.childclass2_set访问一个子类,但是如果我不知道我想要的特定子类的名称怎么办?

有没有一种方法可以在不知道子类名称的情况下沿parent-> child方向获取相关对象


问题答案:

(更新:对于Django 1.2及更高版本,它可以在反向的OneToOneField关系中遵循select_related查询(从而实现向下的继承层次结构),有一种更好的技术可用,它不需要real_type在父模型上添加字段。它可以在InheritanceManager中使用django-model-utils项目。)

这样做的通常方法是将ParentKey添加到Parent模型的ContentType上,该模型存储正确的“ leaf”类的内容类型。否则,你可能必须对子表进行大量查询才能找到实例,具体取决于继承树的大小。这是我在一个项目中做的事情:

from django.contrib.contenttypes.models import ContentType
from django.db import models

class InheritanceCastModel(models.Model):
    """
    An abstract base class that provides a ``real_type`` FK to ContentType.

    For use in trees of inherited models, to be able to downcast
    parent instances to their child types.

    """
    real_type = models.ForeignKey(ContentType, editable=False)

    def save(self, *args, **kwargs):
        if not self._state.adding:
            self.real_type = self._get_real_type()
        super(InheritanceCastModel, self).save(*args, **kwargs)

    def _get_real_type(self):
        return ContentType.objects.get_for_model(type(self))

    def cast(self):
        return self.real_type.get_object_for_this_type(pk=self.pk)

    class Meta:
        abstract = True

它被实现为抽象基类以使其可重用。你还可以将这些方法和FK直接放在特定继承层次结构中的父类上。

如果你无法修改父模型,则此解决方案将不起作用。在这种情况下,你几乎无法手动检查所有子类。



 类似资料:
  • 问题内容: 这是我的json: 有什么方法可以在不知道键是什么的情况下访问此数组中的键和值(在javascript中)? 我的json这样构造的原因是,我通过jquery调用的网络方法正在返回字典。如果无法使用上述方法,那么我需要对返回数据的方式进行哪些更改? 这是我的网络方法的概述: 问题答案: 您可以使用该构造遍历对象的任意属性:

  • 我正在实现一个排序列表类,在这个类中,我将对任何类型的对象进行排序,所以现在我想测试对象是否具有可比性, 我用这段代码覆盖了compareTo()方法:- 所以现在我需要给这些对象分配数字,像这样 但它总是给我一个例外:- 线程“main”中出现异常Java . lang . classcastexception:Java . lang . integer不能转换为java.lang.String

  • 问题内容: 我不知道在不知道父元素的情况下选择第n个元素,最后一个元素或第一个元素的方法。存在,但仅针对儿童,例如: 选择“两个”段落,然后选择“一个”段落。但是,当我拥有动态代码却不知道父级名称是什么,甚至不知道父级实际是什么(可能是div,span,anchor,ul等)时,该怎么办? 例如: 如何在这里选择第二段?(我无法选择,因为我真的不知道它是什么元素(这只是一个假设名称)。 为何会出现

  • 我想知道如何编译。不知道公共类名的java文件。 提供一个示例用例:我正在操作一个沙盒,允许用户向我发送一个字符串。我将该字符串写入。我编译的java文件评估生成的类并回复输出。 ?????.Java语言 如果我随机分配?????。java是一个名称,例如test。java并运行命令javac测试。那么它就会失败 错误:类HelloWorld是公共的,应该在名为HelloW的文件中声明orld.j

  • 问题内容: 如您所见,该回调函数从控制器获取数据。 例如: 在这种情况下,我的第一个警报给了我未定义的内容,第二个/第三个警报弹出窗口显示为: 如何按名称访问值,以便我的第一个警报填写的值是? 问题答案: 代替解析JSON,您可以执行以下操作: 要访问JSON的属性,请执行以下操作: 为什么需要数据,因为数据是一个数组,所以需要对其内容进行检索(第一个元素),它为您提供了一个object 。 并访

  • 我有以下父类: 和2个扩展父类的子类: 我做错了什么?最好的Java编码实践是什么?