当 QuerySet 为空时,如何找到 RelatedManager 正在管理的 class?

How do I find the class that RelatedManager is managing when the QuerySet is empty?

我有两个相关的模型。从一个对象,我想得到另一个的 class name 。目前,我是这样做的:

    associated_model = getattr(object_specific, associated_model_str)
    associated_model_instance = associated_model.all().first()
    if associated_model_instance:
        associated_model_name = associated_model_instance.__class__.__name__

在这种情况下,object_specific 是模型的对象。 associated_model_str 是该模型中引用第二个模型的属性的名称。当我将属性放入 associated_model 时,此变量包含第二个模型的 RelatedManager。如果我这样做 .all().first() 我将从该模型中获取一个对象,从中我可以通过检查属性 .__class__.__name__ 获取 class 名称。问题是有时我在数据库中没有任何第二个模型的实例与第一个模型的实例相关联。换句话说,.all() 是空的。所以我没有第二个 class 的实例来获取 class 名称。如何直接从 RelatedManager 获取 class 名称?

假设有以下型号,您应该能够访问 class 的“型号”字段。


class ModelA(models.Model):
   name = models.TextField('name')


class ModelB(models.Model):
   name = models.TextField('name')
   model_a = models.ForeignKey(ModelA, on_delete=models.PROTECT, related_name='model_bs')


然后在视图中或任何地方

ma = ModelA.objects.first()

ma.model_bs.model.__name__

在django代码中可以看到

https://github.com/django/django/blob/ca9872905559026af82000e46cde6f7dedc897b6/django/db/models/fields/related_descriptors.py#L559

它设置 class 的 属性 称为“模型”,然后将相关模型指定为 Class,这使您可以访问 name