gpt4 book ai didi

python - 如何在不知道子类名称的情况下访问 django 中对象的子类?

转载 作者:IT老高 更新时间:2023-10-28 21:32:30 25 4
gpt4 key购买 nike

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

有没有办法在不知道子类名的情况下获取父->子方向的相关对象?

最佳答案

(更新:对于 Django 1.2 和更新版本,它可以在反向 OneToOneField 关系中跟踪 select_related 查询(因此向下继承层次结构),有一种更好的技术不需要添加 real_type 字段在父模型上。它在 InheritanceManager 项目中以 django-model-utils 的形式提供。)

执行此操作的常用方法是在 Parent 模型上向 ContentType 添加一个 ForeignKey,该模型存储正确“叶”类的内容类型。如果没有这个,您可能必须对子表执行大量查询才能找到实例,具体取决于您的继承树有多大。以下是我在一个项目中的做法:

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 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 直接放在特定继承层次结构中的父类中。

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

关于python - 如何在不知道子类名称的情况下访问 django 中对象的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/929029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com