Как мне найти класс, которым управляет RelatedManager, когда набор запросов пуст?

#python #django #django-related-manager

Вопрос:

У меня есть две модели, которые связаны. Из объекта одного я хочу получить имя класса другого. В настоящее время я делаю это таким образом:

     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__ . Проблема в том, что иногда у меня нет экземпляров второй модели в базе данных, связанных с экземпляром первой модели. Другими словами, в .all() приходит пустой. Поэтому у меня нет экземпляра второго класса, чтобы получить имя класса. Как я могу получить это имя класса непосредственно из RelatedManager?

Ответ №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

Он устанавливает свойство класса под названием «модель», которое затем присваивает связанной модели в качестве класса, что дает вам доступ к имени