【问题标题】:How do I find the class that RelatedManager is managing when the QuerySet is empty?当 QuerySet 为空时,如何找到相关管理器正在管理的类?
【发布时间】:2021-06-15 03:00:48
【问题描述】:

我有两个相关的模型。从一个的对象,我想得到另一个的类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 时,此变量包含第二个模型的相关管理器。如果我这样做.all().first(),我将从该模型中获取一个对象,通过检查属性.__class__.__name__,我可以从中获取类名。问题是有时我在数据库中没有第二个模型的任何实例与第一个模型的实例相关联。换句话说,.all() 是空的。所以我没有第二个类的实例来获取类名。如何直接从 RelatedManager 中获取该类名?

【问题讨论】:

    标签: python django django-related-manager


    【解决方案1】:

    假设以下模型,您应该能够访问类的“模型”字段。

    
    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

    它设置一个名为“模型”的类的属性,然后将相关模型分配为一个类,这使您可以访问 name

    【讨论】:

      猜你喜欢
      • 2017-01-21
      • 2015-11-04
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2015-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多