#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
Он устанавливает свойство класса под названием «модель», которое затем присваивает связанной модели в качестве класса, что дает вам доступ к имени